使用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");


發佈了34 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章