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

"未定義型の使用"エラーが発生し続けます。私はクラスの両方を宣言すると問題が解決すると思ったが、それを理解することはできないと思った。それはちょうど愚かなC + +の構文私は行方不明ですか?未定義の型の使用

EDIT:gamestateの誤植を申し訳ありません。私はStateに変更しましたが、それでもエラーが発生します。

+0

あなたは 'class GameState;'を持っていますが、そのクラスは実際にどこに定義されていますか? – lurker

答えて

17

State::Stateには、実際に定義される前にCoreが使用されています。あなたの例では、簡単にこの問題を解決することができます:あなたがきたよう

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

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

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

それは別の実装では、これらの機能の実装を持っているより多くの一般的な方法ではあります(.cpp)ファイルが、その場合には、前方宣言は働くだろう期待される。その場合

// State.h 
class Core 

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

そして

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

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

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

と実装ファイル:

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

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

いいえ、タイプを宣言し、定義しません。 – Chad

+0

ありがとう、私は自分でそれを得たことはありませんでした。 – Ben

4

あなたは例えば、あなたが名前だけに必要なときに型を宣言転送することができ、ポインタ、参照、関数値の引数、または戻り値の型を作成します。関数定義やポインタの逆参照などで実質的に使用する場合は、定義が必要です。この問題を処理する方法は、メンバー関数を宣言し、クラス定義でそれを定義しないことです(State)。代わりに、Coreの定義が見えたら、それを定義します:

State::State(Core* core){ 
    core->setState(); 
} 
関連する問題