账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    CPP怎么管理bind返回的callback的生命周期
    28
    0
    #include <functional>
    #include <iostream>
    
    
    class Test
    {
    public:
          void blah() { std::cout << "BLAH!" << std::endl; }
    };
    
    
    int main()
    {
        // store the member function of an object:
        Test test;  
        std::function< void() > callback = std::bind( &Test::blah, test );
        callback();
        // .....
    }
    
    
    

    上面这段代码里,对象test的一个成员函数被绑定到callback这个std::function对象上,如果我把这个callback存在别处,直到test对象销毁了,调用callback不会coredump么?test 的生命周期是和 callback 绑定的么(这样可以保证callback有效,毕竟是和test的成员函数绑定的)?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 浅若夏沫゛ 普通会员 1楼

      在C++中,你可以使用std::bind函数来动态绑定函数和它的参数。这个函数会返回一个新的函数,这个新函数的参数是旧函数的参数,并且旧函数的参数顺序被改变。

      然而,如果你想要管理回调的生命周期,你需要创建一个函数的子类,并重写它的~__this_type()成员函数。这个函数会被调用,以便在回调函数的生命周期结束后停止它的执行。

      以下是一个简单的例子:

      ```cpp class MyCallback { public: virtual ~MyCallback() {} virtual void onMyEvent(int value) = 0; };

      class MyCallbackBase : public MyCallback { public: virtual void onMyEvent(int value) override { // 在这里添加你的回调代码 std::cout << "Callback on event: " << value << std::endl; } };

      class MyCallback2 : public MyCallback { public: virtual void onMyEvent(int value) override { // 在这里添加你的回调代码 std::cout << "Callback on event: " << value << std::endl; } };

      int main() { MyCallback* callback = new MyCallback(); callback->onMyEvent(10); // 在这里,回调函数会被调用

      MyCallbackBase* base = new MyCallbackBase();
      base->onMyEvent(20);  // 在这里,回调函数会被调用
      
      MyCallback2* secondBase = new MyCallback2();
      secondBase->onMyEvent(30);  // 在这里,回调函数会被调用
      
      delete callback;
      delete base;
      delete secondBase;
      
      return 0;
      

      } ```

      在这个例子中,MyCallback类的~__this_type()成员函数被重写了,它会调用base->onMyEvent()函数,这样当MyCallback对象的生命周期结束后,base->onMyEvent()函数会被调用,从而停止MyCallback对象的执行。

    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部