我知道www.example.com上的教程boost.org解决了这个问题:Boost.org Signals Tutorial,但是这些例子并不完整,而且有些过于简化。这些例子没有显示包含文件,有些代码部分有点模糊。
我需要的是
A类引发多个事件/信号
ClassB订阅这些事件(可以订阅多个类)
在我的项目中,我有一个较低级别的消息处理程序类,它将事件提升到一个业务类,后者对这些消息进行一些处理并通知UI(wxFrames)。我需要知道所有这些是如何连接起来的(什么顺序,谁调用谁,等等)。
我知道www.example.com上的教程boost.org解决了这个问题:Boost.org Signals Tutorial,但是这些例子并不完整,而且有些过于简化。这些例子没有显示包含文件,有些代码部分有点模糊。
我需要的是
A类引发多个事件/信号
ClassB订阅这些事件(可以订阅多个类)
在我的项目中,我有一个较低级别的消息处理程序类,它将事件提升到一个业务类,后者对这些消息进行一些处理并通知UI(wxFrames)。我需要知道所有这些是如何连接起来的(什么顺序,谁调用谁,等等)。
6条答案
按热度按时间h79rfbju1#
下面的代码是您所请求的内容的最小工作示例。
ClassA
发出两个信号;SigA
发送(并接受)无参数,SigB
发送一个int
。ClassB
有两个函数,调用每个函数时输出到cout
。示例中有一个ClassA
示例(a
)和两个ClassB
(b
和b2
)。main
用于连接和触发信号。值得注意的是,ClassA
和ClassB
彼此一无所知(即它们不是 * 编译时绑定 *)。输出:
为了简洁起见,我使用了一些通常不会在生产代码中使用的快捷方式(特别是访问控制很松,通常会将信号注册"隐藏"在一个函数后面,如KeithB的示例)。
看起来
boost::signal
的大部分困难在于习惯使用boost::bind
。一开始它 * 是 * 有点令人费解!对于一个更棘手的例子,你也可以使用bind
来连接ClassA::SigA
和ClassB::PrintInt
,即使SigA
* 不 * 发出int
:希望能有所帮助!
1mrurvl12#
这是我们代码库中的一个例子。它被简化了,所以我不保证它能编译,但是它应该是接近的。Sublocation是你的类A,Slot1是你的类B。我们有很多这样的插槽,每个插槽订阅一个不同的信号子集。使用这个方案的好处是Sublocation不知道任何插槽的任何信息。插槽不需要成为任何继承层次结构的一部分,只需要实现它们所关心的插槽的功能。我们使用它来通过一个非常简单的接口向我们的系统中添加自定义功能。
Sublocation.h
Sublocation.C
Slot1.h
Slot1.C
eimct9ow3#
你看过boost/libs/signals/example了吗?
q9rjltbz4#
当使用较新的boost(例如1.61)编译MattyT的示例时,它会发出警告
因此,您可以定义BOOST_SIGNALS_NO_DEPRECATION_WARNING来抑制警告,也可以通过相应地更改示例来轻松切换到boost.signal2:
oo7oh9g95#
Boost像QT一样提供了自己的信号和插槽实现。下面是一些实现的例子。
命名空间的信号和插槽连接
考虑名为GStreamer的名称空间
下面介绍如何创建和触发信号
类的信号和插槽连接
考虑一个名为GSTAdaptor的类,该类具有名为func1和func2的函数,其签名如下
下面介绍如何创建和触发信号
eqzww0vc6#
以上答案与信号2相同,应改写: