1

我有一个班级状态和另一个朋友班级游戏。我的问题是,如果我有一个扩展 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访问其内部实现细节,但为什么应该将其扩展到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 回答