结合Boost官网,
对于连接函数而言,有两种方法解决连接的是临时对象的成员函数。
第一种:
类继承:public boost::signals::trackable 当对象死亡,connect函数自动解除连接。
第二种:
由于信号的声明(boost::signal(void()> s 假设是void类型不带参数的函数信号)
其返回值用boost::signals::scoped_connection接收,当临时对象死亡,connect函数也会解绑。
题目:
编写一个程序,定义一个名为 button
的类,表示GUI中的一个可点击按钮。 为该类加入两个方法 add_handler()
和remove_handler()
,它们均要求一个函数名作为参数。 如果 click()
方法被调用,已登记的函数将被按顺序执行。
如下测试你的代码,创建一个 button
类的实例,从事件处理器内部向标准输出流写出一个信息。 调用 click()
函数模拟用鼠标点击该按钮。
解题:
#include <boost/signal.hpp>
#include <iostream>
#include <vector>
#include <algorithm>
#include <boost\bind.hpp>
using namespace std;
class button
:public boost::signals::trackable
{
public:
button() {}
void add_handler() const
{
cout << "add handle" << endl;
}
void remove_handler() const
{
cout << "remove handle" << endl;
}
};
void main()
{
auto_ptr<button> my_button(new button);
boost::signal<void()> click;
click.connect(boost::bind(&button::add_handler, my_button.get()));
click.connect(boost::bind(&button::remove_handler, my_button.get()));
click();
system("pause");
}
利用智能指针管理对象。