私は現在、メイン メニューのように、さまざまなゲームの状態をすべて追跡する状態スタック マネージャーを利用するゲームを作成しています。
しかし、私は解決できないように見える問題に遭遇しました。
これは、問題のあるコードのみを含むように削除された状態クラスです。
class StateManager;
namespace first {
namespace second {
class State {
friend class StateManager;
protected:
/**
* Associates the state with the specified state manager instance.
* @param stateManager The instance to associate this state with
*/
void associateWithManager(StateManager *stateManager) {
mStateManager = stateManager;
}
private:
StateManager *mStateManager;
};
} // second
} // first
以下は状態マネージャーです。これも簡略化されています。
namespace first {
namespace second {
class StateManager {
public:
/**
* Adds a state to the stack.
* @param state The state to add
*/
State &add(State &state) {
state.associateWithManager(this);
return state;
}
};
} // second
} // first
これをコンパイルしようとすると、次のエラーが発生します (ガードなどをインクルードしているため、行番号が少しずれています)。
src/StateManager.cc: In member function 'State& StateManager::add(State&)':
src/StateManager.cc:7:34: error: no matching function for call to 'State::associateWithManager(StateManager* const)'
src/StateManager.cc:7:34: note: candidate is:
In file included from ./include/StateManager.h:4:0,
from src/StateManager.cc:1:
./include/State.h:29:10: note: void State::associateWithManager(StateManager*)
./include/State.h:29:10: note: no known conversion for argument 1 from 'StateManager* const' to 'StateManager*'
どうやら、メソッドでキーワードをthis
使用していなくても、ポインターは const ポインターのように扱われます。ここで何が起こっているのか正確にはわかりません。ポインタは常にですか?私は過去にこの方法で問題なく使用していたと確信しています。const
add
this
const
また、私がこれについて行っている方法は「正しい」方法ですか? それとも、マネージャーについて州に知らせることに関して、より良い解決策はありますか? おそらくシングルトンを使用していますが、私はそれがあまり好きではありません。
編集:名前空間の外側での前方宣言がこの理由であることがわかりました。この結論にたどり着くのに役立ったので、マイクの答えを受け入れる必要がありますか? それとも自分で投稿するべきですか?