美文网首页
注册回调

注册回调

作者: vaisy | 来源:发表于2023-09-24 23:19 被阅读0次

因为遇到了循环依赖问题,所以用到了回调。

本着用到哪学到哪的原则开始搞,但是发现C++ primer里没有明确的章节和例子,所以写了这篇随笔提醒自己。

对于通信来说,很常见的一个场景:
A给B消息;此时A依赖B
B给A消息;此时B依赖A
编译不会允许这样的事情发生 于是我们需要使用回调:
由A来调用B,实现A给B发消息。
A如果需要处理来自B的消息,需要在B中注册回调

A.h:
#include <B.h>
class A{
     init(){
         // 注册回调:B发生EventX时,调用OnEvent
         b->regEventXCallBack(OnEvent,this);
     }
     private:
     make_shared<class B>b obj;
}

B.h
class B{
     // 设置回调
     regEventXCallBack(OnEvent,obj A){
         // 设置B的成员函数m_func转发到A->OnEvent
     }
     handleEventX(){
         m_func();// 通知A
    }
     private:
     m_func;
}

逻辑并不复杂,问题是:
m_func如何使用OnEvent这个函数地址
std提供了两个使用频率非常高的好东西:
std::function:函数的包装器,用来提供模板,可以给classB用
std::bind:用于绑定
所以:

A.h:
#include <B.h>
class A{
     init(){
         // 注册回调:B发生EventX时,调用OnEvent
         b->regEventXCallBack(std::bind(&A::OnEvent, this));
     }
     private:
     make_shared<class B>b obj;
}

B.h
class B{
     // 设置回调
     regEventXCallBack(std::function<void ()> func){
         // 将A的成员函数绑定到B
         m_callback = func;
     }
     handleEventX(){
         m_callback();// 通知A
    }
     private:
     // 定义了一个没有返回值也没有参数的回调
     std::function<void ()> m_callback;
}

相关文章

网友评论

      本文标题:注册回调

      本文链接:https://www.haomeiwen.com/subject/lesqbdtx.html