我有两个类Player和Team,其中每个玩家类都有一个指向团队的指针
class Player{
private: Team* team;}
并且每个团队都有一个指向玩家的指针列表
class Team{
private: list<Player*> playerlist;}
现在我想通过在列表中对他进行广告来了解玩家在哪个队伍中玩牌。之后我希望能够为团队添加类似team.getid()
的内容我为一个函数尝试了以下解决方案:
std::list<Team>::iterator* teamsearch(std::list<Team> a, int b)
{
int i = 0;
std::list<Team>::iterator Listitem;
std::list<Team>::iterator* Listitemtest = &Listitem;
while (i == 0){
for (Listitem = a.begin(); Listitem != a.end(); ++Listitem)
{
if (Listitem->getteamID_() == b)
i++;
Listitemtest = &Listitem;
}
};
std::cout << "TeamID: " << (*Listitemtest)->getteamID_() << std::endl;
return Listitemtest;
}
这个想法是它返回一个迭代器,它指向玩家团队的地址。这是对的吗?
然后我尝试通过这种方式再次解除引用迭代器来解决团队问题:
Team team;
team.setteamID_(0);
team.setteamname_("team1");
Teamvector.push_back(team);
std::list<Team>::iterator Listitem;
Listitem = *teamsearch(Teamvector, 0);
在MSVC120.dll中给出了运行时错误... include \ list:list iterator not derefencable
不知何故,似乎迭代器指向团队列表的末尾?
答案 0 :(得分:4)
您正在返回指向局部变量的指针。返回指针指向的迭代器在函数返回时已经被销毁。
你应该按价值回归,不要在这里烦恼。迭代器很容易复制。
答案 1 :(得分:1)
没有人提到这一点,但第一个主要问题是这一行:
Listitemtest = &Listitem;
表示Listitemtest
指向迭代器Listitem本身。它没有指向ListItem指向的东西。
因此,当您转到(*Listitemtest)->getteamID_()
时,这相当于Listitem->getteamID_()
。但由于Listitem
现在位于a.end()
,因此这是一种无效的解除引用。
要解决此问题,您应该停止使用指向迭代器的指针。我无法想到使用指向迭代器的指针是一个好主意 - 相反,它表明你做错了。
相反,make Listitemtest
是与Listitem
相同类型的迭代器,然后通过转到Listitemtest = Listitem
来设置它。然后它会指出您感兴趣的项目。
但是,修复此问题后,您仍然无法返回Listitemtest
。这是因为它指向std::list<Team> a
,它是函数的局部变量,并在您返回时停止存在。要解决此问题,请将参数设为std::list<Team> &a
。然后你可以安全地返回迭代器。