【发布时间】:2017-11-05 15:24:32
【问题描述】:
我有以下代码:
list<Item> playerItems = player.GetPlayerItems();
list<Item>::iterator iterator;
for (iterator = playerItems.begin(); iterator != playerItems.end(); ++iterator)
{
if (itemToSell == (*iterator).GetName())
{
if ((*iterator).GetCost() < GetShopGold())
{
SetShopItem(*iterator);
SetShopGold(GetShopGold() - (*iterator).GetCost());
player.SetPlayerGold(player.GetPlayerGold() + (*iterator).GetCost());
//The issue is here
iterator = player.GetPlayerItems().erase(iterator);
return true;
}
else
{
cout << "I can't afford that..." << endl;
}
}
}
这是 RemovePlayerItem 代码:
void Player::RemovePlayerItem(list<Item>::iterator& iterator)
{
iterator = _playerItems.erase(iterator);
}
当我运行代码时,我收到以下错误:
_DEBUG_ERROR("list erase iterator outside range");
我google了一下,似乎和我的迭代器有关,但我不确定错误和迭代器之间的关系。
相比之下,如果我将 _playerItems 变量设为全局变量,然后使用此全局变量启动/结束迭代器,则如果我使用以下代码 iterator = player._playerItems.erase(iterator);,代码运行良好
编辑
这是 GetPlayerItems() 函数
list<Item> Player::GetPlayerItems()
{
return _playerItems;
}
谁能指出我正确的方向?
【问题讨论】:
-
不要到处写
(*iterator).foo,你可以写iterator->foo。 -
GetPlayerItems()是按引用返回还是按值返回? -
iterator是playerItem的迭代器,而不是player.GetPlayerItems()的返回值。您正在尝试使用指向不同列表的迭代器从一个列表中擦除。 -
@IgorTandetnik - 这不是评论,而是答案。