在push_back()之后删除Vector项

C++ Vector item being deleted after push_back()

本文关键字:之后 删除 Vector push back      更新时间:2023-10-16

我有一个问题,推一个对象到一个向量。

我有三个类参与其中:Pack.h, Player.h, Hand.h

包发牌,玩家从包中接受牌,然后手从玩家那里接受牌。

功能:

发牌组

bool Pack::Deal(std::vector<Player>players, unsigned int numberOfCards)
{
    //This assumes that if we cannot deal the requested number of cards we do not deal any cards at all.
    //If we wanted to deal as many cards as possibly we would check for errors while iterating over players.
    if (m_pack_of_cards.size() < players.size() * numberOfCards) //check that we have enough cards to complete deal
    {
        std::cout << "Not enough cards to complete deal." << std::endl;
        return false;
    }
    else
    {
        for (unsigned int i = 0; i < numberOfCards; i++)
        {
            for (auto player : players)
            {
                player.Accept_Card_From_Pack(m_pack_of_cards.back());
                m_pack_of_cards.pop_back();
            }
        }
        return true;
    }
}

玩家从牌组中接受卡片

bool Player::Accept_Card_From_Pack(Card card)
{
    m_player_hand.Accept_Card_From_Player(card);
    return true;
}

接受玩家牌的手牌

bool Hand::Accept_Card_From_Player(Card card)
{   
    m_hand_of_cards.push_back(card);
    return true;
}

My main function

int main()
{
    Pack pack = Pack();
    std::vector<Player> players(4);
    for (int i = 0; i < 4; i++)
    {
        players[i] = Player("Player: " + std::to_string(i));
    }
    pack.Deal(players, 8);
    system("pause");
    return 0;
}

它的作用是创建一个新的包,创建一些玩家,给每个玩家发一些牌。

这是玩家拿牌的问题,包调用玩家收牌函数,玩家收牌函数调用手的收牌函数,然后手应该把牌推回到它的牌向量上。

它确实会把它推回去,如果我std::cout push_back操作前后的vector的大小,它会从0变为1,但它不会保留这个元素,所以下次我把某个东西推回去的时候,它会再次给我0和1作为push_back操作前后的vector的大小。

哦,这是一个大学作业(我必须把它放在这里吗?

弄清楚了问题,这通常发生在我发布问题之后,但如果有人有类似的问题,我将在这里回答。

问题出在玩家交易功能的这一部分:

for (auto player : players)
        {
            player.Accept_Card_From_Pack(m_pack_of_cards.back());
            m_pack_of_cards.pop_back();
        }

应该是:

for (auto &player : players)
            {
                player.Accept_Card_From_Pack(m_pack_of_cards.back());
                m_pack_of_cards.pop_back();
            }

正如下面Eelke和Underscore_d所提到的,也应该传递参数:

std::vector<Player>players 

std::vector<Player>&players