基类未定义

Jim*_*aid 8 c++ class base undefined

我的代码生成错误

'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
Run Code Online (Sandbox Code Playgroud)

以下是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
Run Code Online (Sandbox Code Playgroud)

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

gzt*_*mas 10

如果您有任何源文件包含GameObjects.h之前ProjectilObject.h或未ProjectilObject.h直接包含,那么编译器将首先在知道内容之前ProjectilObject通过include 查找声明.那是因为首先包括然后声明.在这种情况下,存在的包含将不起作用,因为已经定义.GameObjects.hWorldObjectGameObjects.hProjectilObject.hWorldObjectGameObjects.hProjectilObject.h_GAMEONJECTCODE_H_

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

  • 前向声明上的链接明确指出您不能使用它来定义基类 (2认同)

Vla*_*nko 5

如果不查看整个代码,很难回答这个问题。即使支架错位也能起到作用。检查您的命名空间 - 您确定 WorldObject 位于同一命名空间中吗?

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

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

如果未显示,请将编译指示移至父 .h 文件并再次检查编译器输出。这样你就可以很容易地定位到错误所在。