使用lambda表达式时,this数据失效的bug

在一次回调中使用了lambda表达式,传进来的值失效,主要是对lambda表达式了解的不够深入,记录下来!

 1、[函数对象参数],标识一个Lambda的开始,这部分必须存在,不能省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用那些到定义Lambda为止时Lambda所在作用范围内可见的局部变量(包括Lambda所在类的this)。函数对象参数有以下形式:
           1、空。没有使用任何函数对象参数。
           2、=。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。
           3、&。函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)。
           4、this。函数体内可以使用Lambda所在类中的成员变量。
           5、a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。
           6、&a。将a按引用进行传递。
           7、a, &b。将a按值进行传递,b按引用进行传递。
           8、=,&a, &b。除a和b按引用进行传递外,其他参数都按值进行传递。
           9、&, a, b。除a和b按值进行传递外,其他参数都按引用进行传递。


如下改正,问题就解决了:

Director::getInstance()->getScheduler()->performFunctionInCocosThread([&, this, region, delay, speed, percent]() //注意要加:this

其他代码不动。

	m_speedTest->start(si.name, si.ip, si.port, testTime, [&](std::string region, int delay, float speed, int percent)
<span style="white-space:pre">	</span> {
		Director::getInstance()->getScheduler()->performFunctionInCocosThread([&, this, region, delay, speed, percent]() //加上:this
<span style="white-space:pre">		</span>{
			int iPercent = percent;
			if (iPercent >= 100)
			{
				if (m_loadingBar->getPercent() < 50.0f)//timeout
				{
					iPercent = 0;
					startTestCallBack(region, delay, speed, percent);
					return;
				}
			}
			m_loadingBar->setPercent(iPercent);
           <span style="white-space:pre">		</span> if (percent >= 100)
		   <span style="white-space:pre">	</span> {
				m_isTimeout = false;
			    if (m_speedTest)
			    {
			        removeSpeedTest();
					startTestCallBack(region, delay, speed, percent);
			    }
		   <span style="white-space:pre">	</span> }
       <span style="white-space:pre">		</span> });
	});
	//如果timeout连不上,手动断开
	m_isTimeout = true;
	scheduleOnce([&](float f)
	{
		if (m_isTimeout)
		{
			removeSpeedTest();
		}
	},
	testTime + 1, "speedTestTimeout");


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值