Базов клас недефиниран

Моят код по-долу генерира грешката

'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

Има някои други класове в този файл, но те не би трябвало да имат значение, не мисля. Може би има малка грешка, която не видях, но не разбирам защо се получава тази грешка. Когато имате нужда от повече от кода, чувствайте се свободни.


person JimRaid    schedule 20.05.2012    source източник
comment
Имахте предвид MRenderable вместо MRenderAble? Освен това имате кръгови зависимости, протичащи между двата файла. Вместо това се нуждаете от предварителна декларация.   -  person chris    schedule 20.05.2012
comment
@chris Същата грешка със и без предна декларация. MRenderable и MRenderAble няма нищо общо с проблема. Аз мисля. MRenderAble е друг клас, който създадох във файла IAttribute.h.   -  person JimRaid    schedule 20.05.2012
comment
Е, трябва да включите пълен клас, за да го наследите, така че предната декларация е безполезна там, но във вашия GameObjects.h, предна декларация на ProjectilObject.h вероятно би била достатъчна.   -  person chris    schedule 20.05.2012
comment
Можете да наследявате само от завършен тип.   -  person Kerrek SB    schedule 20.05.2012


Отговори (3)


Ако имате изходен файл, който включва 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 във вашия изходен файл, или използвайте предварителни декларации.

person gztomas    schedule 20.05.2012
comment
Връзката към предните декларации изрично посочва, че не можете да я използвате за дефиниране на базов клас - person IAmTheAg; 23.11.2014

Трудно е да се отговори на този въпрос, без да се разгледа целият код. Дори неправилно поставена скоба може да се брои. Проверете вашите пространства от имена - сигурни ли сте, че WorldObject е в същото пространство от имена?

Предлагам ви да използвате съобщението #pragma, като го поставите близо до дефиницията на WorldObject и проверите изхода на компилатора:

#pragma съобщение ("Световният обект е дефиниран")

Ако не се появи, преместете прагмата в родителския .h файл и проверете изхода на компилатора отново. С това можете лесно да намерите грешката.

person Vladimir Sinenko    schedule 20.05.2012

В моя случай: изтривам включване на производен клас от заглавния файл на базовия клас.

например:

файл 1: #include B.h

-> A()

файл 2:

-> B() : A()

решение: изтрийте #include B.h от file1

person rkilic    schedule 15.09.2020