boost::bind绑定成员函数时,第一个参数传递对象的特殊情况
来源:互联网 发布:淘宝店怎么运营起来 编辑:程序博客网 时间:2024/06/07 11:40
boost::bind绑定成员函数时,第一个参数传递对象的特殊情况
boost::bind(&memberfunction, obj, _1, _2........)类似这样的用法,我们叫做成员函数绑定,boost库的文档中说的很清楚,第一个参数可以是value、pointer和reference,即传值、传地址和传引用都是可以的,所以在一般情况下,下面三种使用bind的形式都是成立的。class A
{
public:
void func();
};
A a;
A& r = a;
boost::bind(&A::func, a);
boost::bind(&a::func, &a);
boost::bind(&a::func, r);
由上面的代码可以看出,我们可以随便传任意一种类对象的形式,函数模板会自动寻找最为匹配的为我们实现。但是有两种情况是特殊的,即:
1、该对象不可进行拷贝构造函数。
2、该对象不可随意被析构。
发现这个问题是在我编写单件模式时的遇见的,当时发现我的单件对象在bind中被析构了一次,这很不寻常,为什么bind会调用第一个参数的析构呢?跟踪进了boost的源码才发现,原来所有的参数都会被拷贝一遍,然后析构一遍,这样一来,我们传递参数的时候就会有一些小麻烦了,首先必须保证参数能够被拷贝而不影响逻辑和数据一致性,其次,参数能够被析构而不影响逻辑和数据一致性。单件是全局性质的数据,所以绝对不可以析构,那么这种情况的话,我们只好传递单件对象的地址,而不能传递值或引用。
另:附上出错问题的代码如下
class InputDevice
: public EventSource
, public Singleton<InputDevice>
{
public:
};
class TestUI
: public Singleton<TestUI>
{
public:
~TestUI(){
std::cout<<"~TestUI"<<std::endl;
}
void processKeyboard(EventArgs& args){
std::cout<<"键盘响应"<<std::endl;
}
void processMouse(EventArgs& args){
std::cout<<"鼠标响应"<<std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
new FrameUpdaterManager;
new DelayEventSender;
new InputDevice;
new TestUI;
InputDevice::getSingleton().mEventSet.addEvent("KeyDown", Event());
InputDevice::getSingleton().mEventSet.addEvent("KeyUp", Event());
InputDevice::getSingleton().mEventSet.addEvent("MouseLDown", Event());
InputDevice::getSingleton().mEventSet.addEvent("MouseLUp", Event());
InputDevice::getSingleton().mEventSet.addEvent("MouseRDown", Event());
InputDevice::getSingleton().mEventSet.addEvent("MouseRUp", Event());
//TestUI& ui = TestUI::getSingleton(); // 用此行便会出错
TestUI* ui = TestUI::getSingletonPtr();
// 出错开始
InputDevice::getSingleton().mEventSet["KeyDown"] += boost::bind(&TestUI::processKeyboard, ui, _1);
InputDevice::getSingleton().mEventSet["KeyUp"] += boost::bind(&TestUI::processKeyboard, ui, _1);
InputDevice::getSingleton().mEventSet["MouseLDown"] += boost::bind(&TestUI::processMouse, ui, _1);
InputDevice::getSingleton().mEventSet["MouseLUp"] += boost::bind(&TestUI::processMouse, ui, _1);
InputDevice::getSingleton().mEventSet["MouseRDown"] += boost::bind(&TestUI::processMouse, ui, _1);
InputDevice::getSingleton().mEventSet["MouseRUp"] += boost::bind(&TestUI::processMouse, ui, _1);
delete TestUI::getSingletonPtr();
delete InputDevice::getSingletonPtr();
delete DelayEventSender::getSingletonPtr();
delete FrameUpdaterManager::getSingletonPtr();
return 0;
}
: public EventSource
, public Singleton<InputDevice>
{
public:
};
class TestUI
: public Singleton<TestUI>
{
public:
~TestUI(){
std::cout<<"~TestUI"<<std::endl;
}
void processKeyboard(EventArgs& args){
std::cout<<"键盘响应"<<std::endl;
}
void processMouse(EventArgs& args){
std::cout<<"鼠标响应"<<std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
new FrameUpdaterManager;
new DelayEventSender;
new InputDevice;
new TestUI;
InputDevice::getSingleton().mEventSet.addEvent("KeyDown", Event());
InputDevice::getSingleton().mEventSet.addEvent("KeyUp", Event());
InputDevice::getSingleton().mEventSet.addEvent("MouseLDown", Event());
InputDevice::getSingleton().mEventSet.addEvent("MouseLUp", Event());
InputDevice::getSingleton().mEventSet.addEvent("MouseRDown", Event());
InputDevice::getSingleton().mEventSet.addEvent("MouseRUp", Event());
//TestUI& ui = TestUI::getSingleton(); // 用此行便会出错
TestUI* ui = TestUI::getSingletonPtr();
// 出错开始
InputDevice::getSingleton().mEventSet["KeyDown"] += boost::bind(&TestUI::processKeyboard, ui, _1);
InputDevice::getSingleton().mEventSet["KeyUp"] += boost::bind(&TestUI::processKeyboard, ui, _1);
InputDevice::getSingleton().mEventSet["MouseLDown"] += boost::bind(&TestUI::processMouse, ui, _1);
InputDevice::getSingleton().mEventSet["MouseLUp"] += boost::bind(&TestUI::processMouse, ui, _1);
InputDevice::getSingleton().mEventSet["MouseRDown"] += boost::bind(&TestUI::processMouse, ui, _1);
InputDevice::getSingleton().mEventSet["MouseRUp"] += boost::bind(&TestUI::processMouse, ui, _1);
delete TestUI::getSingletonPtr();
delete InputDevice::getSingletonPtr();
delete DelayEventSender::getSingletonPtr();
delete FrameUpdaterManager::getSingletonPtr();
return 0;
}
0 1
- boost::bind绑定成员函数时,第一个参数传递对象的特殊情况
- boost::bind 绑定成员函数
- boost::bind无参非成员函数的绑定和调用(一)
- Boost关于bind的使用以及函数对象和传递参数的问题
- 使用boost.bind绑定class的成员函数作为boost thread的入口
- boost::bind 函数绑定
- boost::bind绑定成员变量,函数书嵌套
- boost::bind boost::function绑定万能函数测试2(类成员函数和虚函数)
- JavaScript传递参数的特殊情况
- C++ Boost::bind函数包装器使用,boost::bind与伪函数的绑定使用
- boost::bind 函数与类成员的区别
- boost bind 全局函数(非成员函数)
- C++关于tr1中绑定成员函数的bind使用
- Boost Bind 类成员函数指针
- 黑马程序员-引用类型传递参数的特殊情况(string)
- Perl 对象是函数的第一个参数
- 使用std::bind绑定成员函数
- 使用Intent传递自定义类对象出现的特殊情况
- 单线程断点续传(数据库方式)
- 使用achartengine-1.1.0画折线图
- java在linux系统下文件夹出现中文乱码的问题
- ruby安装步骤
- 信息增益,信息增益率,Gini
- boost::bind绑定成员函数时,第一个参数传递对象的特殊情况
- sublime text 2中Emmet 常用的技巧
- 界面工具:GPU呈现模式分析
- c#解压压缩文件和文件夹
- sed c
- shell常用命令之五 awk
- 记一次 对新浪微博客户端 的scheme唤醒/通信
- 让脸部显示在更正确的位置
- 一步一步教你使用uCOS-II