1、对象之间交互的方式
C++对象之间通信的几种方式
C++对象之间通信的三种常见方式
几种回调的对比
(1)B是A的成员变量。A可随便调用B的接口,但B不能调用A(除非传指针),信号槽关联相互调用。
(2)A和B的对象在第三方类中。信号槽关联相互调用。
(3)继承虚接口
(4)消息总线(观察者模式)
2、消息总线(同步,关心结果)
2.1 ICallback
2.2 IDataBus
2.3 IMessage
2、消息总线(异步,不关心结果)
基于 Qt 实现消息总线
代码:https://github.com/cmguo/QtEventBus
3、工程应用
C++11 MessageBus–消息队列实现(同书上代码)
C++的阻塞式消息总线message_bus实现(c++17同上)
思想: 以接收函数为主,发送只传递相关参数。
#include "messagebus.h"
#include <iostream>
std::multimap<std::string, std::any> MessageBus::m_map;
// 使用boost的使用 std::multimap<std::string, boost::any> MessageBus::m_map;
class Test
{
public:
void test(int, const char*) {
std::cout<< "hit test" << std::endl;
return;
}
};
int main()
{
Test t;
std::string key = "test";
// 订阅"test"消息,参数为:主题为key,回调函数为Test::test,类对像是t(不是指针)
g_messagebus.attach<int, const char*>(key, &Test::test, t);
// 向订阅者发送消息,消息参数是 123 和 "abc",回调函数Test::test将会被执行
g_messagebus.sendMessage<int, const char*>(key, 123, "abc");
// 移除订阅"test"
g_messagebus.remove<int, const char*>(key);
return 0;
}