基类未定义

时间:2012-05-20 17:29:59

标签: c++ class undefined base

我的代码生成错误

  

'WorldObject':[Base class undefined(翻译自德语)]

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

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

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

3 个答案:

答案 0 :(得分:9)

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

要避免这种情况,请确保在源文件中包含ProjectilObject.h而不是GameObjects.h,或使用forward declarations

答案 1 :(得分:2)

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

我建议您使用#pragma消息,将其放在WorldObject定义附近并检查编译器输出:

  

#pragma message("定义了World对象")

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

答案 2 :(得分:0)

在我的情况下:我从基类头文件中删除派生类include。

例如:

文件1: #include“ B.h”

-> A()

文件2:

-> B():A()

解决方案:从文件1中删除#include“ B.h”