在过去的两个晚上,我一直在抨击我,试图弄清楚这一点并没有取得积极成果.每当我想要连接一个类的成员函数和另一个类的信号时,在增强信号中有一个东西,如果我想稍后断开连接,我必须将结果连接保存在一个变量中.如果以后,我想将相同的成员函数连接到其他类信号(成员函数仍然与前一个类信号连接)我必须保存这个新连接以便管理它.我的问题是,有什么方法可以避免这种情况吗?
您不应该保持connection
实例,您应该能够通过传递原始可调用来断开与信号的连接signal::disconnect
,如Boost.Signals教程中所述.对于成员函数,问题在于你无法将它们直接传递给它们signal
,你要么将它们包装在自定义函数对象中,然后将它们作为参数提供,signal::disconnect
或者使用Boost.Bind,它本身就不是很有用因为你不能方便地声明它的返回类型.但是,使用Boost.Bind和Boost.Function可以解决这个问题.
我希望我回答你的问题.
或者,您可以将返回的连接分配给signal :: scoped_connection类型的变量.它是一种连接类型,可在销毁或重新分配时自动断开连接.这有效地将信号槽连接寿命限制到特定范围.
例如,当您重新分配myConnection时,先前的连接会自动断开连接:
scoped_connection myConnection = someObject.Signal.connect(MyHandler);
myConnection = totallyDifferentObject.Signal.connect(MyHandler);
Run Code Online (Sandbox Code Playgroud)
在我们的项目中,我们通常将成员变量声明为作用域连接.因此,它们的范围与所属特定对象实例的实时时间相匹配.这是在对象实例被破坏时自动断开对象实例所连接的任何信号的便捷方式.如果没有作用域连接,则必须在析构函数中手动断开连接.如果你忽略在实例被销毁时断开连接,你最终会调用无效的信号处理程序,这会使你的程序崩溃.