指针不能从列表中解除可拒绝

时间:2014-03-13 23:16:37

标签: c++ list pointers

我有两个类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

不知何故,似乎迭代器指向团队列表的末尾?

2 个答案:

答案 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。然后你可以安全地返回迭代器。