在push_back()之后删除Vector项
C++ Vector item being deleted after push_back()
我有一个问题,推一个对象到一个向量。
我有三个类参与其中: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
相关文章:
- 将数组的地址分配给变量并删除
- 将内容从第一个文件("constituencies")移动到第二个文件("temp")并在之后重命名时,我的文件被删除
- 在双向链表中给定节点之后删除节点
- 在x元素之后,从QT中删除x元素之后的文件夹中的项目
- 我什么时候应该使用删除?(在动态创建的2D数组之后未删除的后果)
- 在std::move()之后删除堆上结构的成员
- p = new String [0]和p = new Int [0]之后,为什么当删除[] p时字符串版本崩溃
- 无法删除 txt 文件中 getline(cin , (变量)) 之后的下一行
- 在fork之后删除condition_variable时,boost崩溃
- 视觉C++删除文本文件中位于特定单词之前/之后的所有内容
- 删除特定字符之后的所有内容
- 尝试将上一个节点链接到要删除的节点之后的节点时出错
- 删除字符(以及字符)之后的所有内容
- 在删除行的正常块之后检测到堆损坏
- 在链表中的specifeec元素之后添加元素,并删除第一个元素
- 对象似乎正在删除自己,或者在构造函数之后内存发生了变化
- 在push_back()之后删除Vector项
- 为什么第一个值是2814,而不是在我删除代码块之后
- 是否必须在析构函数之后手动删除对象?
- Std::string::erase()将删除使用Std::string::find()找到的第一个字符之后的所有内容