因为遇到了循环依赖问题,所以用到了回调。
本着用到哪学到哪的原则开始搞,但是发现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;
}