基类未定义(Base class undefined)

2019-07-29 11:19发布

我下面的代码生成错误

“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类的代码文件中:

GameObjects.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

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

Answer 1:

如果您有任何包含源文件GameObjects.h之前ProjectilObject.h或不包括ProjectilObject.h直接,那么编译器将首先找到的声明ProjectilObject通过包括GameObjects.h知道什么之前WorldObject是。 这是因为GameObjects.h包括:第一ProjectilObject.h ,然后宣布WorldObject 。 在这种情况下,包括GameObjects.h目前在ProjectilObject.h因为将无法正常工作_GAMEONJECTCODE_H_将已定义。

为了避免这种情况,要么一定要包括ProjectilObject.h而不是GameObjects.h在源文件中,或使用前向声明 。



Answer 2:

这是很难回答这个问题,而不看整个代码。 即使是放错地方的支柱可以指望。 检查您的命名空间 - 你确定的WorldObject是在同一个名字?

我建议你把它放到WorldObject定义附近,检查编译器输出使用#pragma消息:

的#pragma消息(“世界对象被定义”)

如果它没有显示出来,将编译父.h文件中,并再次检查编译器输出。 有了这个,你可以很容易地找到错误。



文章来源: Base class undefined