Базовый класс не определен

мой код ниже генерирует ошибку

'WorldObject': [базовый класс 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:

у GameObject.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

в этом файле есть некоторые другие классы, но они не должны не думаю, что это имеет значение. Возможно, есть крошечная ошибка, которую я не видел, но я не понимаю, почему эта ошибка возникает. Когда вам нужно больше кода, не стесняйтесь.

2 ответов


если у вас есть исходный файл, который включает в себя 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 в исходном файле, или использовать вперед деклараций.


трудно ответить на этот вопрос, не глядя на весь код. Даже неуместная скоба могла считаться. Проверьте пространства имен-вы уверены, что WorldObject находится в том же пространстве имен?

Я предлагаю вам использовать сообщение #pragma, поместив его рядом с определением WorldObject и проверив вывод компилятора:

#pragma message ("мировой объект определен")

Если он не отображается, переместите прагму в родительский объект .H-файл и проверить компилятор снова выводит данные. С помощью этого вы можете легко найти ошибку.