【发布时间】:2021-07-22 10:10:51
【问题描述】:
我有一个包含 ID 字符串的 Player 对象。我试图通过遍历玩家列表来检查玩家是否已经存在。如果播放器已经存在,我想返回现有播放器,否则我将创建一个 Player 对象的新实例。
Player *playerExists(const std::string &playerId, const std::vector<Player>* players)
{
for (Player existingPlayer : *players)
{
if (existingPlayer.playerId == playerId)
{
std::cout << "Player " << existingPlayer.name << " exists" << std::endl;
return &existingPlayer;
}
}
return new Player();
}
问题似乎出在 return 语句中。我不知道如何将特定对象返回给指针。这似乎是我发现不会出错的唯一方法(谈论 return 语句中的 & sing)。
Player* player = playerExists("SomeID", listOfPlayers);
listOfPlayers->push_back(*player);
delete player;
我对使用原始指针很陌生,所以我可能只是不明白这里的问题是什么。如果有人能解释我做错了什么,我将不胜感激。
【问题讨论】:
-
你的问题不是很清楚。请注意,您的
for循环正在复制每个Player,并且返回的地址肯定是错误的。尝试循环引用,看看是否能解决问题。 -
注意——整个代码可以是一个使用
std::find_if的两行函数,不需要循环。作为副产品,这将消除for循环中的错误,因为不会有for循环。 -
如果允许,请将
const std::vector<Player>* players替换为const std::vector<Player> & players。对引用的限制将使您的代码更加安全。 -
是的,使用
for (auto player = (*existingPlayer).begin(); player != (*existingPlayer).end(); player++)使用player->playerId,如果找到则返回player。 std::vector 的元素是连续的,所以可以使用迭代器(指针),找到后返回指针。 -
@DavidC.Rankin 您的示例使用的是迭代器,而不是指针。然后它将向调用者返回一个迭代器。向量迭代器不保证被实现为指针。
标签: c++