11

我下面的代码生成错误

'WorldObject':[未定义的基类(从德语翻译)]

为什么是这样?这是产生此错误的代码:

ProjectilObject.h:

#pragma once

#ifndef _PROJECTILOBJECT_H_
#define _PROJECTILOBJECT_H_

#include "GameObjects.h"
class WorldObject;
class ProjectilObject: public WorldObject
{
public:
    ProjectilObject(IGameObject* parent,int projectiltype);

    void deleteyourself();
protected:
virtual void VProcEvent( long hashvalue,    std::stringstream &stream);
    virtual void VInit();
    virtual void VInitfromStream( std::stringstream &stream     );
    virtual void VonUpdate();
    virtual void VonRender();
private:
    vec3 vel;

    float lifetime;
    float lifetimeend;

    vec3 target;

    int m_projectiltype;
};

#endif

下面是 WorldObject 类的代码文件:

游戏对象.h:

#pragma once

#ifndef _GAMEONJECTCODE_H_
#define _GAMEONJECTCODE_H_

#include "IGameObject.h"
#include "Sprite.h"
#include "GamePath.h"
#include "HashedString/String.h"
#include "IAttribute.h"
#include "CharacterObjects.h"

...

class WorldObject: public IGameObject, public MRenderAble
{
public:
    WorldObject(IGameObject* parent);
    virtual bool IsDestroyAble();
    virtual bool IsMageAble();
    virtual bool IsRenderAble();
protected:
    virtual void VProcEvent( long hashvalue, std::stringstream &stream);
    virtual void VonUpdate();
    virtual void VonRender();
    virtual void VInit() =0;
    virtual void VInitfromStream( std::stringstream &stream ) =0;
    virtual void VSerialize( std::stringstream &stream );

    vec3 poscam;    
};

...

#endif

该文件中还有其他一些类,但我认为它们无关紧要。也许有一个我没有看到的小错误,但我不明白为什么会产生这个错误。当您需要更多代码时,请随意。

4

3 回答 3

11

如果你有任何源文件包含GameObjects.hbeforeProjectilObject.h或不ProjectilObject.h直接包含,那么编译器会先ProjectilObject通过 include in找到声明,GameObjects.h然后才知道是什么WorldObject。那是因为GameObjects.h首先包含ProjectilObject.h然后声明WorldObject。在这种情况下,GameObjects.hpresent in的包含ProjectilObject.h将不起作用,因为_GAMEONJECTCODE_H_已经定义了。

为避免这种情况,请确保包含ProjectilObject.h而不是GameObjects.h在源文件中,或者使用前向声明

于 2012-05-20T17:45:17.030 回答
5

如果不查看整个代码,很难回答这个问题。即使是放错位置的支架也可以计算在内。检查您的命名空间 - 您确定 WorldObject 在同一个命名空间中吗?

我建议您通过将 #pragma 消息放置在 WorldObject 定义附近并检查编译器输出来使用它:

#pragma message(“世界对象已定义”)

如果它没有显示,请将 pragma 移动到父 .h 文件并再次检查编译器输出。有了这个,您可以轻松找到错误。

于 2012-05-20T17:42:54.890 回答
0

就我而言:我从基类头文件中删除派生类包含。

例如:

文件 1:#include “Bh”

-> A()

文件 2:

-> B() : A()

解决方案:从 file1 中删除 #include "Bh"

于 2020-09-15T09:10:51.407 回答