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.h
vóór ProjectilObject.h
bevat of ProjectilObject.h
niet rechtstreeks bevat, dan compiler zal eerst de declaratie van ProjectilObject
vinden via de include in GameObjects.h
voordat hij weet wat WorldObject
is. Dat komt omdat GameObjects.h
eerst ProjectilObject.h
bevat en vervolgens WorldObject
declareert. In dat geval zal het opnemen van GameObjects.h
aanwezig in ProjectilObject.h
niet werken omdat _GAMEONJECTCODE_H_
al gedefinieerd is.
Om dit te voorkomen, moet u ofwel ProjectilObject.h
opnemen in plaats van GameObjects.h
in 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