Доступ к функции «родитель» или «владелец» C ++ - PullRequest
0 голосов
/ 19 марта 2019

У меня есть класс, Game, который имеет в аргументе std::vector другого класса, Case.В этом классе Case у меня есть функция, которая сообщает мне, когда мы нажимаем на нее.И я хочу отправить сигнал моему объекту Game, которому принадлежит Cases, когда нажата Case.В game.h:

class Game
{
public:
    Game();
    void doSomething();

private:
    std::vector<Case> board;
};

А в case.h:

class Case
{
    public:
        Case(Game &g);
        void functionWhichIsCalledWhenCaseIsPressed();
    private:
        Game game;
};

Итак, когда вызывается functionWhichIsCalledWhenCaseIsPressed(), я хочу вызвать функцию doSomething().РЕДАКТИРОВАТЬ:

Я пытался, но мне также нужно создать случай из вектора ... На самом деле, у меня есть Case c; в моем Game.h ... И я не могу его инициализировать ...Я пытался c = Game(*this); Но у меня есть ошибка:

error: object of type 'Case' cannot be assigned because its copy assignment operator is implicitly delete

РЕДАКТИРОВАТЬ: Спасибо, это сделано!

1 Ответ

1 голос
/ 20 марта 2019

Для этого вам нужно включить навигацию от Case к его Game. Один из способов сделать это - сохранить в каждом случае ссылку или указатель на владельца и инициализировать эту ссылку при создании:

class Game; 
class Case
{
    public:
        Case(Game& x);
        void functionWhichIsCalledWhenCaseIsPressed();
    private: 
        Game &game;  // <<<<-------------- reference to owner
};

С этим предварительным условием вы можете легко вызвать функцию родителя:

Case::Case(Game& x) : game(x){
}
void Case::functionWhichIsCalledWhenCaseIsPressed() {
    cout<<"Clicked"<<endl; 
    game.doSomething();    //<<<===== invoke the function of the owner
}

Для этого требуется, чтобы игра инициализировала игровое поле и предоставила конструктору правильные параметры:

Game::Game() {
    for (int i=0; i<10; i++)
        board.push_back(Case(*this));
}
void Game::doSomething() { cout<<"click on game"<<endl; }

Демоверсия

...