2013-08-17 16 views
10
#include <iostream> 

class Core; 
class State; 

int main(){ 
     std::cin.get(); 
     return 0; 
} 

class State{ 
public: 
    State(Core* core){ 
     core->setState(); 
    } 
}; 

class Core{ 
public: 
    Core(){ 
     State state(this); 
    } 
    void setState(){ 
     std::cout << "setting state" << std::endl; 
    } 
}; 

Continuo a ricevere l'errore "uso di tipo non definito". Ho pensato che se inoltro dichiaro entrambe le classi, risolverebbe il problema ma non riesco a capirlo. È solo una stupida sintassi del C++ che mi manca?Uso di tipo non definito

EDIT: Mi dispiace per l'errore di battitura gamestate, ho cambiato per Stato e produce ancora l'errore.

+0

Hai 'classe GameState;' ma dove è effettivamente definita quella classe? – lurker

risposta

17

In State::State, si utilizza Core prima che sia effettivamente definito. È possibile risolvere questo facilmente nel tuo esempio:

class State{ 
public: 
    State(Core* core); 
}; 

class Core{ 
    // This stays the same... 
}; 

State::State(Core* core) 
{ 
    core->setState(); 
} 

E 'molto più comune, in pratica, di avere l'implementazione di queste funzioni in un'implementazione separato (.cpp) file, nel qual caso le dichiarazioni previsionali funzionerebbero come hai previsto.

In tal caso:

// State.h 
class Core 

class State{ 
public: 
    State(Core* core); 
}; 

E

// Core.h 
#include "State.h" 

class Core{ 
public: 
    Core(){ 
     State state(this); 
    } 

    void setState(){ 
     std::cout << "setting state" << std::endl; 
    } 
}; 

E il file di implementazione:

// State.cpp 
#include "State.h" 
#include "Core.h" 

State::State(Core* core) 
{ 
    core->setState(); 
} 
+0

No, dichiara il tipo, non lo definisce. – Chad

+0

Grazie mille, non l'avrei mai ottenuto da solo. – Ben

4

È possibile inoltrare dichiarare un tipo quando hai solo bisogno di nome, per esempio, per formare puntatori, riferimenti, argomenti del valore di funzione o tipi di ritorno. Se lo si utilizza in modo sostanziale, ad es. In una definizione di funzione o attraverso il dereferenziamento di un puntatore, è necessaria la definizione. Il modo per risolvere il problema è dichiarare la funzione membro ma non definirla nella definizione di classe di State. Invece, lo definiresti una volta che la definizione di Core è stata vista:

State::State(Core* core){ 
    core->setState(); 
} 
Problemi correlati