【问题标题】:Base class undefined基类未定义
【发布时间】:2012-05-27 09:14:20
【问题描述】:

我下面的代码会产生错误

'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

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

【问题讨论】:

  • 您的意思是MRenderable 而不是MRenderAble?此外,这两个文件之间存在循环依赖关系。您需要一个前向声明。
  • @chris 有和没有前向声明的相同错误。 MRenderableMRenderAble 与问题无关。我想。 MRenderAble 是我在“IAttribute.h”文件中创建的另一个类。
  • 嗯,你需要包含一个完整的类来继承它,所以前向声明在那里没有用,但在你的GameObjects.h 中,ProjectilObject.h 的前向声明可能就足够了。
  • 你只能从 complete 类型继承。

标签: c++ class undefined base


【解决方案1】:

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

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

【讨论】:

  • 前向声明的链接明确指出您不能使用它来定义基类
【解决方案2】:

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

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

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

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

【讨论】:

  • 命名空间 - 这是我的基类未定义错误的根本问题。一旦我确定我没有循环依赖,我发现有问题的基类没有被命名空间限定。
【解决方案3】:

在我的例子中:我从基类头文件中删除派生类包含。

例如:

文件 1: #include "B.h"

-> A()

文件 2:

-> B() : A()

解决方案:从 file1 中删除 #include "B.h"

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多