나는이 방법을 Cocos2d X 게임에서 사용하고 있습니다. I는 상기와 같은 정수 cardNum 로그 때람다 함수의 변수가 쓰레기 값을 나타내고 있습니다
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);
}
이상하게, I는 람다 함수 내부 로그에서 다른 값을 얻는다. 예를 들어, 상위 2 개 로그와 가장 아래쪽 로그에서 "OpponentNode :: discard < 402>"를 얻지 만 람다 함수 내부의 로그에서 "OpponentNode :: discard < 64>"를 얻습니다.
다른 점 :
- 람다 블록이 마지막으로 실행된다.
- 저는 주로 64와 같은 값이나 -15493456과 같은 쓰레기 값을 얻습니다.
내 생각 엔 정수 cardNum이 실행 전에 할당 해제됩니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?
'cardNum' 매개 변수에 대한 참조를 캡처하고 있습니다. 나는 당신이 가치에 의해 그것을 포착하고 싶다고 생각할 것입니다. –
그래서 [cardNum, & delegate, & discardedCard]()와 같은 것을 사용해야할까요? @AlanStokes – user3164248
[&, cardNum]()은 어떨까요? @AlanStokes – user3164248