C++11 bind的使用陷阱

最近使用C++11 bind 遇到如下陷阱:

 

class BBB
{
public:
	BBB() { _state = false; };
	BBB(const BBB & b) {  };
	void  Open(){ _state = true; };
	void  Close(){  _state = false;};
	bool  show() { return _state;};
protected:
	bool   _state;
};



BBB c;

function<void ()> funopen;
funopen = bind(&BBB::Open,c);

function<void ()> funclose;
funclose = bind(&BBB::Close,c);

funclose();
funopen();

cout<<c.show()<<endl;
 class BBB
{
public:
	BBB() { _state = false; };
	BBB(const BBB & b) {  };
	void  Open(){ _state = true; };
	void  Close(){  _state = false;};
	bool  show() { return _state;};
protected:
	bool   _state;
};


   实际输出 0  , 调试发现调用open() 和 close()函数的并不是一个对象。

 查阅了一下相关资料:http://www.cnblogs.com/linyilong3/p/3371339.html  

 在我们调用bind的时候,实际上将整个类的当前"状态"都复制了过去,因此加入拷贝构造函数进行了测试:      

 class BBB
{
public:
	BBB() { _state = false; };
	BBB(const BBB & b) {  };
	void  Open(){ _state = true; };
	void  Close(){  _state = false;};
	bool  show() { return _state;};
protected:
	bool   _state;
}

果然BBB(const BBB & b) {  };
在bind的时候被调用,证明当前bind的对象是实际要bind对象的副本<span style="font-family: Arial, Helvetica, sans-serif;">因此根据使用的意图,正确的用法是应该传入对象的指针:</span>
	function<void ()> funopen;
	funopen = bind(&BBB::Open,&c);

	function<void ()> funclose;
	funclose = bind(&BBB::Close,&c);
测试输出为 1

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值