Basisklasse niet gedefinieerd

Mijn onderstaande code genereert de fout

‘WorldObject’: [Basisklasse niet gedefinieerd (vertaald uit het Duits)]

Waarom is dit? Hier is de code die deze fout veroorzaakt:

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

Hier is het codebestand van de WorldObject-klasse:

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

Er zijn enkele andere klassen in dit bestand, maar die zouden er niet toe moeten doen, denk ik. Misschien is er een kleine fout die ik niet heb gezien, maar ik begrijp niet waarom deze fout wordt geproduceerd. Voel je vrij als je meer van de code nodig hebt.


Antwoord 1, autoriteit 100%

Als u een bronbestand heeft dat GameObjects.hvóór ProjectilObject.hbevat of ProjectilObject.hniet rechtstreeks bevat, dan compiler zal eerst de declaratie van ProjectilObjectvinden via de include in GameObjects.hvoordat hij weet wat WorldObjectis. Dat komt omdat GameObjects.heerst ProjectilObject.hbevat en vervolgens WorldObjectdeclareert. In dat geval zal het opnemen van GameObjects.haanwezig in ProjectilObject.hniet werken omdat _GAMEONJECTCODE_H_al gedefinieerd is.

Om dit te voorkomen, moet u ofwel ProjectilObject.hopnemen in plaats van GameObjects.hin uw bronbestand, of verklaringen doorsturen.


Antwoord 2, autoriteit 27%

Het is moeilijk om deze vraag te beantwoorden zonder naar de hele code te kijken. Zelfs een misplaatste beugel kan tellen. Controleer uw naamruimten – weet u zeker dat het WorldObject in dezelfde naamruimte staat?

Ik raad u aan het #pragma-bericht te gebruiken door het in de buurt van de WorldObject-definitie te plaatsen en de compiler-uitvoer te controleren:

#pragma-bericht (“Wereldobject is gedefinieerd”)

Als het niet verschijnt, verplaats dan de pragma naar het bovenliggende .h-bestand en controleer de uitvoer van de compiler opnieuw. Hiermee kunt u de fout gemakkelijk lokaliseren.


Antwoord 3

In mijn geval: ik verwijder de afgeleide klasse include uit het headerbestand van de basisklasse.

bijvoorbeeld:

bestand 1 :
#include “B.h”

-> A()

bestand 2:

-> B() : A()

oplossing: verwijder #include “B.h” uit bestand1

Other episodes