1
我在Cocos2d X遊戲中使用此方法。lambda函數中的變量顯示垃圾值
void OpponentNode::discard(int cardNum)
{
log("\nOpponentNode::discard <%d>\n", cardNum);
for (int i = 0; i < vecOpponentHand.size(); i++)
{
if (vecOpponentHand.at(i) == cardNum)
{
vecOpponentHand.erase(vecOpponentHand.begin() + i);
break;
}
}
CardSprite * discardedCard;
for (int i = 0; i < vecOpponentCards.size(); i++)
{
if (vecOpponentCards.at(i)->getTag() == cardNum)
{
discardedCard = vecOpponentCards.at(i);
vecOpponentCards.erase(vecOpponentCards.begin() + i);
break;
}
}
log("\nOpponentNode::discard <%d>\n", cardNum);
discardedCard->makeFaceUp();
RotateTo * rotate = RotateTo::create(0.4 * SPEED_MULTIPLIER, 0);
MoveTo * move = MoveTo::create(0.4 * SPEED_MULTIPLIER,
origin + Vec2(visibleSize.width * 0.75, visibleSize.height * 0.6));
Spawn * spawn = Spawn::create(rotate, move, NULL);
CallFunc * callFunc = CallFunc::create(
[&]()
{
log("\nOpponentNode::discard <%d>\n", cardNum); //this one shows garbage/different value
if (delegate)
{
delegate->opponentNodeDidFinishDiscard(this, cardNum);
}
this->removeChild(discardedCard);
});
discardedCard->runAction(Sequence::create(spawn, callFunc, NULL));
log("\nOpponentNode::discard <%d>\n", cardNum);
}
奇怪的是,當我登錄整數cardnum中像上面,我從lambda函數內部日誌不同的值。例如,我從頂部2個日誌和最底部的日誌中獲得「OpponentNode :: discard < 402>」,但從lambda函數內部的日誌中獲得「OpponentNode :: discard < 64>」。
其他景點:
- 拉姆達塊最後執行。
- 我通常會得到像64這樣的值或垃圾值,如-15493456。
我的猜測是整數cardNum在執行前取消分配。任何人都可以指向正確的方向嗎?
您正在捕獲對'cardNum'參數的引用。我認爲你想通過價值來捕捉那一個。 – 2014-12-06 11:15:50
所以我應該使用類似[cardNum,&delegate,&discardedCard]()? @AlanStokes – user3164248 2014-12-06 11:44:41
[&,cardNum]()怎麼樣? @AlanStokes – user3164248 2014-12-06 11:52:47