我有一个班级州和另一个朋友班级游戏。我的问题是,如果我有一个扩展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");
}
如何在不公开州长的情况下完成这项工作?
答案 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); \
} \