【问题标题】:Access to "parent" or "owner" function C++访问“父”或“所有者”函数 C++
【发布时间】:2019-08-10 11:55:38
【问题描述】:

我有一个类Game,它的参数是另一个类Casestd::vector。在这个类Case 中,我有一个函数可以告诉我什么时候点击它。当按下Case 时,我想向拥有Cases 的对象Game 发送信号。 在 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()。 编辑:

我试过了,但我还需要从向量中创建一个案例...实际上,我的 Game.h 中有一个Case c;...我无法初始化它...我试过c = Game(*this);但我有一个错误:

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

编辑:谢谢,完成了!

【问题讨论】:

  • 一种方法是让每个 Case 存储一个指向 Game 对象的指针。这能解决您的问题吗?
  • 我会走另一条路——让Case 持有一个函数指针或std::function,它可以在需要时调用,然后让Game 在填充时分配doSomething() std::vector.

标签: c++ relationship class-design ownership-semantics


【解决方案1】:

为此,您需要启用从Case 到其所属Game 的导航。一种方法是在每个 Case 中保留一个引用或指向所有者的指针,并在构造时初始化此引用:

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

Online demo

【讨论】:

    猜你喜欢
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2013-05-09
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    相关资源
    最近更新 更多