Базовый класс не определен
мой код ниже генерирует ошибку
'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-файл и проверить компилятор снова выводит данные. С помощью этого вы можете легко найти ошибку.