1

私は現在、メイン メニューのように、さまざまなゲームの状態をすべて追跡する状態スタック マネージャーを利用するゲームを作成しています。

しかし、私は解決できないように見える問題に遭遇しました。

これは、問題のあるコードのみを含むように削除された状態クラスです。

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 ポインターのように扱われます。ここで何が起こっているのか正確にはわかりません。ポインタは常にですか?私は過去にこの方法で問題なく使用していたと確信しています。constaddthisconst

また、私がこれについて行っている方法は「正しい」方法ですか? それとも、マネージャーについて州に知らせることに関して、より良い解決策はありますか? おそらくシングルトンを使用していますが、私はそれがあまり好きではありません。

編集:名前空間の外側での前方宣言がこの理由であることがわかりました。この結論にたどり着くのに役立ったので、マイクの答えを受け入れる必要がありますか? それとも自分で投稿するべきですか?

4

2 に答える 2

2

それが唯一のエラーですか?コンパイルすると、最初に次のエラーが発生します。

test.cpp:8:31: error: ‘StateManager’ has not been declared

クラスをフレンドとして宣言する場合、そのクラスは既に宣言されている必要があります。そうでない場合、宣言は無視されます。class StateManager;したがって、 の定義の前に、周囲の名前空間で宣言する必要がありますclass State。その変更により、コードがコンパイルされます。

于 2013-04-05T13:59:29.440 に答える