在写出来的函数出来后,向量丢失数据

cha*_*ins 2 c++ vector

我只是在缺席10年后重新回到C++,所以决定尝试编写一个ASCII BlackJack游戏.我决定使用一个向量来保持牌组和牌手,但我发现当我调用初始交易函数时,它应该为DEALER向量牌和PLAYER向量牌分配2张牌,它写的牌很好但是当它出来后来我想要打印手,我得到一个超出范围的例外.

代码片段如下!

void deck::initialDeal(player dealer, player player1)
{
    for(int i = 0; i < 2 ; i++)
    {
        dealer.addHand(myDeck[i]);
        myDeck.erase(myDeck.begin());
        player1.addHand(myDeck[i]);
        myDeck.erase(myDeck.begin());
    }
}
Run Code Online (Sandbox Code Playgroud)

以上只需从我的主甲板上取几张牌并调用addHand例程将卡添加到玩家矢量手中:

void player::addHand(card dealtCard)
{
    hand.push_back(dealtCard);
}
Run Code Online (Sandbox Code Playgroud)

如果我在addHand函数中输入一个例程来输出手向量,它可以正常工作并显示数据被放入.

但是,稍后我想将手打印到屏幕上,因此有另一个名为printHand()的函数

void player::printHand()
{
    if (dealer == true)
    {
        cout << hand[0].getNumber() << hand[0].getSuit() << " ";
        cout << hand.size() << endl;
    }
    else
    {
        for(std::vector<card>::size_type x = 0 ; x != hand.size() ; x++)
        {
            cout << hand[x].getNumber() << hand[x].getSuit() << " ";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

目前我只是在与经销商方面打交道,所以它进入了该功能的经销商分支,那就是当我收到错误时.

我觉得我应该在这里使用指针,因为addHand()函数中创建的数据一旦完成就会被删除?

Som*_*ude 6

您似乎通过副本传递所有参数,而不是通过引用传递(并且通过引用我不是指针).这意味着您只修改副本而不是原件.

如果你像这样修改函数原型:

void initialDeal(player& dealer, player& player1)
Run Code Online (Sandbox Code Playgroud)

参数通过引用传递,并允许您修改作为参数传递的原始对象.

  • @ user2718166:请注意,修改其参数的函数通常会使代码难以维护,因为您需要仔细考虑修改内容的位置.我建议在一个类中包装矢量并使用正确命名的方法来修改它. (2认同)