基类未定义

新手上路,请多包涵

我下面的代码生成错误

‘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

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

原文由 JimRaid 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 582
2 个回答

If you have any source file that includes GameObjects.h before ProjectilObject.h or does not include ProjectilObject.h directly, then the compiler will first find the declaration of ProjectilObject 在知道 WorldObject 是什么之前,通过 GameObjects.h 中的包含。那是因为 GameObjects.h 首先包含 ProjectilObject.h 然后声明 WorldObject 。在这种情况下,包含在 GameObjects.h 中的 ProjectilObject.h 将不起作用,因为 _GAMEONJECTCODE_H_ 已经定义。

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

原文由 gztomas 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

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

原文由 Vladimir Sinenko 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题