儿童班继承友谊

时间:2013-10-03 22:50:53

标签: c++ inheritance friend access-control

我有一个班级州和另一个朋友班级游戏。我的问题是,如果我有一个扩展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");
}

如何在不公开州长的情况下完成这项工作?

2 个答案:

答案 0 :(得分:1)

所以如果情况如下:

class Game {
  friend class State;
}

class State {

}

class MenuState : public State {

}

然后答案是否定的,因为friend指令不是隐式继承的。我不明白为什么它应该被继承,Game显式允许State访问其内部实现细节,但为什么这应该扩展到State的子类,它可以做不同的事情?

答案 1 :(得分: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);                      \
}                                                                \