2014-12-06 5 views
1

나는이 방법을 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>"를 얻습니다.

다른 점 :

  1. 람다 블록이 마지막으로 실행된다.
  2. 저는 주로 64와 같은 값이나 -15493456과 같은 쓰레기 값을 얻습니다.

내 생각 엔 정수 cardNum이 실행 전에 할당 해제됩니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?

+1

'cardNum' 매개 변수에 대한 참조를 캡처하고 있습니다. 나는 당신이 가치에 의해 그것을 포착하고 싶다고 생각할 것입니다. –

+0

그래서 [cardNum, & delegate, & discardedCard]()와 같은 것을 사용해야할까요? @AlanStokes – user3164248

+0

[&, cardNum]()은 어떨까요? @AlanStokes – user3164248

답변

2

cardNum 매개 변수에 대한 참조를 캡처하고 있습니다. 나는 당신이 가치에 의해 그것을 포착하고 싶다고 생각할 것입니다.

무엇이 delegate인지는 분명하지 않습니다. 클래스 멤버라고 가정하면 [this, discardedCard, cardNum]이 필요하다고 생각합니다. 어느 쪽이 당신은 단지 [=]으로 줄여 쓸 수 있습니다, 나는 명백한 것이 더 분명하다고 생각하지만.

관련 문제