2013-10-03 3 views
1

У меня есть класс State и другая игра класса друзей. Мой вопрос в том, что если у меня есть класс MenuState, который расширяет State, является также MenuState другом игры?Класс ребенка наследует дружбу

EDIT:

Так что, если у меня есть такая ситуация:

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

Нет, проверьте следующее, дружба не будет унаследована. http://stackoverflow.com/questions/3561648/why-does-c-not-allow-inherited-friendship –

+0

См. Исходный вопрос. –

ответ

1

Так что, если ситуация как следующий

class Game { 
    friend class State; 
} 

class State { 

} 

class MenuState : public State { 

} 

Тогда ответ нет, так как friend директива не неявно наследуются. И я не понимаю, почему он должен быть унаследован, Game явно разрешает State получить доступ к его внутренним деталям реализации, но почему это следует расширить до подклассов State, которые могут делать разные вещи?

+0

У меня есть объект (объявленный private StateManager * myStateManager = new StateManager(), в игре), что я хочу, чтобы MenuState имел доступ, потому что я передаю myStateManager в MenuState :: Create (StateManager * Parent, const std :: string stateName). Не делая общедоступным myStateManager, возможно ли это? –

+0

Прошу прощения за это. Это было действительно запутанно, не очень хорошо при форматировании текста в комментариях. Если вы не совсем понимаете, что я имею в виду или хочу, чтобы я опубликовал точный код, я отредактирую OP. –

+0

Пожалуйста, смотрите оригинальный вопрос. –

0

Вы можете добавить функцию доступа в игру. Даже если MenuState - друг игры, это все равно не сработает, поскольку вы пытаетесь передать частному члену 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);      \ 
}                \ 
Смежные вопросы