1

クラス State と別のフレンド クラス Game があります。私の質問は、State を拡張するクラス MenuState がある場合、MenuState は Game の友達でもあるのでしょうか?

編集:

したがって、次のような状況がある場合:

class Game
{
    private:
        StateManager* myStateManager = new StateManager();
}

class State
{
    public:
        static void create(StateManager* Parent, const std::string name) {};

    private:
        StateManager* parent;
}

#define DECLARE_STATE_CLASS(T)                                   \
static void create(StateManager* Parent, const std::string name) \
{                                                                \
        T* myState = new T();                                    \
        myState->parent = Parent;                                \
        Parent->manageState(name, myState);                      \
}                                                                \

class MenuState : State
{
    public:
        DECLARE_STATE_CLASS(MenuState)
}

int main()
{
    Game app;
    MenuState::create(This needs to be the stateManager in app, "MenuState");
    app.init("MenuState");
}

状態マネージャーを公開せずにこれを機能させるにはどうすればよいですか?

4

2 に答える 2

1

したがって、状況が次のような場合

class Game {
  friend class State;
}

class State {

}

class MenuState : public State {

}

friendディレクティブは暗黙的に継承されないため、答えはノーです。なぜ継承する必要があるのか​​ 、Game明示的Stateに内部実装の詳細にアクセスできるようにする必要があるのか​​\u200b\u200bわかりませんが、なぜこれをStateさまざまなことができるサブクラスに拡張する必要があるのですか?

于 2013-10-03T22:53:16.000 に答える
0

ゲームにアクセス機能を追加できます。MenuState が Game のフレンドであっても、Game のプライベート メンバーを渡そうとしているため、関数内でアクセスしないため、これは機能しません。

たとえば、Game を変更する権限がない場合は、State 内にアクセス関数を追加し、MenuState からそのアクセス関数を使用できます。

class State
{
    public:
    static void create(StateManager* Parent, const std::string name) {};
    StateManager* getManager(Game* g){
        return g->myStateManager;
    }

    private:
    StateManager* parent;
}

#define DECLARE_STATE_CLASS(T)                                   \
static void create(Game* g, const std::string name) \
{                                                                \
        T* myState = new T();                                    \
        myState->parent = State::getManager(g);                              \
        Parent->manageState(name, myState);                      \
}                                                                \
于 2013-10-04T04:44:27.947 に答える