2013-08-17 7 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; 
    } 
}; 

Ciągle pojawia się błąd "użycie niezdefiniowanego typu". Pomyślałem, że jeśli przekażę oświadczenie obu klas, to rozwiążę problem, ale nie mogę tego rozgryźć. Czy to po prostu głupia składnia C++, której mi brakuje?Używanie niezdefiniowanego typu

EDYCJA: Przepraszam za literówkę gamestate, zmieniłem ją na Stan i nadal generuje błąd.

+0

Masz 'class GameState;' ale gdzie jest ta klasa faktycznie zdefiniowana? – lurker

Odpowiedz

17

W State::State używasz Core, zanim zostanie on zdefiniowany. Można to naprawić łatwo w przykładzie:

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

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

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

To znacznie bardziej powszechne w praktyce mają realizację tych funkcji w osobnym realizacji (.cpp) plików, w którym to przypadku forward deklaracje będzie działać jak masz spodziewany.

W tym przypadku:

// State.h 
class Core 

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

I

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

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

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

a plik realizacja:

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

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

Nie, deklaruje typ, nie definiuje go. – Chad

+0

Dziękuję bardzo, nigdy bym tego nie zrobił. – Ben

4

można przekazać zadeklarować typ kiedy trzeba tylko nazwy, na przykład, do tworzenia wskaźników, odwołań, argumentów wartości funkcji lub typów zwracanych. Jeśli zasadniczo go używasz, np. W definicji funkcji lub przez dereferencję wskaźnika, potrzebujesz definicji. Sposób radzenia sobie z problemem polega na deklarowaniu funkcji składowej, ale nie na definiowaniu jej w definicji klasy State. Zamiast tego zdefiniowałbyś go po pojawieniu się definicji Core:

State::State(Core* core){ 
    core->setState(); 
} 
Powiązane problemy