子班继承友谊

Child class inherit friendship

本文关键字:友谊 继承      更新时间:2023-10-16

我有一个类状态和另一个朋友类游戏。我的问题是,如果我有一个扩展状态的类 MenuState,那么 MenuState 也是游戏的朋友吗?

编辑:

因此,如果我遇到这样的情况:

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");
}

如何在不公开状态管理器的情况下完成这项工作?

所以如果情况如下

class Game {
  friend class State;
}
class State {
}
class MenuState : public State {
}

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

您可以向游戏添加访问功能。即使 MenuState 是 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);                      
}