bind对成员函数进行绑定时,不要忘记成员函数的隐含参数this。所以在bind的时候要传入对应的类对象或者对象指针(若调用bind做参数的函数已经获取了对象如for_each,就只要用占位符_1占位就可以了)。
话分两路,撇开已获取对象的情况,如果在bind的时候传入的是对象,
class CallBack
{
public:
CallBack()
{
i=0;
}
virtual void complete(){
i+=100;
std::cout<<"complete "<<i<<std::endl;
}
private:
int i;
};
bind_test obj;
CallBack call;
obj.Start(boost::bind(&CallBack::complete,
call));
obj.Start(boost::bind(&CallBack::complete,
call));
bind会做份对象拷贝(这点很重要),此处调用complete的是拷贝的对象,不会对实参call有影响。例子中将会打印
complete 100
complete 100
call中的i值将一直会是0。
第二种情况就是,传递对象指针:
obj.Start(boost::bind(&CallBack::complete,
&call));
obj.Start(boost::bind(&CallBack::complete,
&call));
这种情况就是在bind内部也只是指针拷贝,那么用的就是同一个对象了call,看看打印结果
complete 100
complete 200
call中的属性i就是累加的咯
总结:bind成员函数必须传对象相关参数作为第一个参数,
传啥拷贝啥,不想对象被拷贝就传引用或者指针。