我在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时,我从lambda函数内部的日志中获得了不同的值。例如,我从顶部2个日志和最底部日志中获取“OpponentNode::discard ”,但从lambda函数内部的日志中获取“OpponentNode::discard ”。

其他要点:
  • lambda块最后执行。
  • 我通常会获得64之类的值或-15493456之类的垃圾值。

  • 我的猜测是整数cardNum在执行之前被释放。谁能指出我正确的方向?

    最佳答案

    您正在捕获对cardNum参数的引用。我认为您想按值(value)来捕获那个。

    我不清楚delegate是什么。假设它是一个类成员,那么我认为您只需要[this, discardedCard, cardNum]即可。您可以将其缩写为[=],尽管我认为显式的更为清晰。

    10-04 14:54