Archief - Cross-include issue

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

ultddave

Legacy Member
Hey allemaal,

Zit eigenlijk met een redelijk simpel probleem, maar zie door het bos de bomen even niet meer.

Taal: C++

Het gaat namelijk om een GameStateManager die uit 2 klassen bestaat:
- GameStateManager (deze include State.h en houdt een lijst van States bij (std::list<State*>))
- State (bevat een referentie naar de manager en gebruikt dus een forward declaration naar de manager, maar include deze niet.)

Maar ik krijg het nog niet gecompileerd.

Code:
./build/Debug/MinGW_Qt-Windows/GameStateManager.o: In function `~State':
State.h:22: undefined reference to `vtable for State'

Dus herhaling;

In State.h doe ik "class GameStateManager;" en in de GameStateManager.h doe ik #include "State.h".

Of iemand een alternatief voorstel hoe ik een gamestatemanager zou implementeren? Observer pattern zou in principe ook mogelijk zijn maar zal ook voor problemen zorgen met includes.

Stukje code uit State.h:
Code:
class GameStateManager;

class State{
public:
    State() {   /* voorlopig nog leeg*/ }
    ~State() { /* voorlopig nog leeg*/ } <= State.h:22 waar undef. ref. is
public:
....
protected:
    GameStateManager *m_stateManager;
};

Ik weet dat je met forward declarations pointers moet gebruiken en dergelijke, maar om één of andere reden lukt het in dit geval niet. Hulp en tips zijn welkom, dank bij voorbaat.

Mvg,
Dave

ultddave

Legacy Member
Constructor en destructor in cpp file plaatsen zorgt voor dezelfde vtable fout maar dan met een verwijzing naar de regels in de cpp file.

Als ik de constructor en destructor zelfs volledig weghaal uit de header en cpp file, geeft hij een vtable fout op de regel van "class State {".


Als ik daarenboven ook nog eens deze destructor van de manager leeg maak, compiled hij wel.
Code:
GameStateManager::~GameStateManager()
{
    /* Deze versie geeft vtable fouten */
    while(!m_scenes.empty())
    {
        delete(m_scenes.front());
        m_scenes.pop_front();
    }
}

Code:
GameStateManager::~GameStateManager()
{
    /* Deze lege versie compiled zonder problemen */
}

EDIT; Bedankt voor de reply ;).


Mvg,
Dave

ultddave

Legacy Member
Code:
    State(){}
    virtual ~State() {}

Deze regels werken wel ineens (in de header). Vreemd waarom het ineens met virtual wel werkt, ofwel mis ik wat kennis van C++. ;)

Bedankt voor de hulp.

Mvg,
Dave

Daedie

Legacy Member
Dit heeft meer te maken met compilerkennis dan met C++ kennis. Ik ben aardig zeker dat uw code in Visual Studio wel zou compileren. Maar dan wel met potentiële memory leaks aangezien uw destuctor niet virtual was, ervan uitgaande dat ge overerft van de State klasse.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan