2014-12-06 3 views
1

Я использую этот метод в игре Cocos2d X.Переменная внутри лямбда-функции показывает значение мусора

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 как выше, я получаю другое значение из журнала внутри лямбда-функции. Например, я получаю «OpponentNode :: discard < 402>» из двух верхних журналов и самого нижнего регистра, но получаю «OpponentNode :: discard < 64>» из журнала внутри функции лямбда.

Другие:

  1. Блок лямбда выполнен последним.
  2. В основном я получаю значения, такие как 64 или значения для мусора, такие как -15493456.

Моя догадка - это целочисленная карта. Начинается освобождение до исполнения. Может ли кто-нибудь указать мне правильное направление?

+1

Вы записываете ссылку на параметр 'cardNum'. Я бы подумал, что вы хотите захватить это по стоимости. –

+0

Итак, я должен использовать что-то вроде [cardNum, & delegate, and discardedCard]()? @AlanStokes – user3164248

+0

Как насчет [&, cardNum]()? @AlanStokes – user3164248

ответ

2

Вы записываете ссылку на параметр cardNum. Я бы подумал, что вы хотите захватить это по стоимости.

Мне непонятно, что такое delegate. Предполагая, что это член класса, я думаю, вам просто нужно [this, discardedCard, cardNum]. Который вы могли бы сократить до [=], хотя я думаю, что явный яснее.

Смежные вопросы