将函数连接到boost :: signal运行,但不调用函数
我在我的代码中有一个类Yarl
,其成员函数refresh
我想绑定到两个boost::signal
s。这些信号之一是这样定义的类EventHandler
的成员:将函数连接到boost :: signal运行,但不调用函数
class EventHandler {
public:
boost::signal<void()> sigRefresh;
};
另一种是声明如下在另一个文件中的*浮动的信号:
namespace utility {
static boost::signal<void()> signal_refresh;
}
在
Yarl
成员函数
,我连接refresh
到的信号是这样的:
events::EventHandler eventHandler;
eventHandler.sigRefresh.connect(boost::bind(&Yarl::refresh, this));
utility::signal_refresh.connect(boost::bind(&Yarl::refresh, this));
,后来我叫两个信号是这样的:
sigRefresh();
signal_refresh();
此代码编译并运行,sigRefresh
按预期工作。但是,当我拨打signal_refresh
时没有任何反应。据我所知,refresh
从来没有实际上连接到signal_refresh
。任何人看到我做错了什么?
我在猜测你是多重定义signal_refresh。静态关键字在声明之前向我暗示代码片段位于头文件中,并且必须将静态代码放在那里才能在不重新定义符号错误的情况下进行编译。如果你已经完成了这个任务,那么包括头文件在内的每个源文件都将得到一个唯一的signal_refresh副本,因此你所调用的实例可能不是你连接它的实例。
我可能完全不在这里,但它是可能的。
这正是我所做的。我认为这是一种不好的做法,但这更像是一件很快的事情,看看我能不能做些什么。会导致信号失败? – Max 2010-07-08 21:08:54
没有信号没有失败。你只需要了解在这种情况下什么静态手段。将非类绑定变量声明为静态使其对于翻译单元(对象文件)是本地的,并且不会被导出。然后,您可以在每个对象文件中使用相同名称的变量,而不会出现链接错误。您需要在标题中将信号定义为extern,并在一个源文件中创建它*不带static关键字。那么你应该去。 – bradgonesurfing 2010-07-08 21:16:46
它工作。谢谢你的帮助。 – Max 2010-07-08 21:31:00
signals :: connect()返回signals :: connection的一个实例,它可以帮助您调试问题。对于初学者,请检查连接()。 – fingerprint211b 2010-07-08 19:00:37