不能从列表中解引用的指针

Pointer not derefencable from a list

本文关键字:引用 指针 列表 不能      更新时间:2023-10-16

我有两个类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…包含list: list迭代器不可解引用

似乎迭代器指向teamlist的末尾?

返回一个指向局部变量的指针。当函数返回时,返回指针所指向的迭代器已被销毁。

你应该按值返回,这里不要用指针。复制迭代器很简单。

还没有人提到这一点,但第一个主要问题是这一行:

Listitemtest = &Listitem;

表示Listitemtest指向,即迭代器Listitem本身。它不指向listtitem所指向的东西。

所以当你转到(*Listitemtest)->getteamID_()时,它等于Listitem->getteamID_()。但是由于Listitem现在在a.end(),这是一个无效的解引用。

要解决这个问题,应该停止使用指向迭代器的指针。我想不出在任何一种情况下,使用指针指向迭代器是一个好主意——相反,这是你做错了什么事情的标志。

Listitemtest设置为与Listitem相同类型的迭代器,然后将其设置为Listitemtest = Listitem。然后它会指出你感兴趣的项目。

然而,已经解决了这个问题,你仍然不能返回Listitemtest。这是因为它指向std::list<Team> a,这是函数的一个局部变量,当您返回时它将停止存在。要解决这个问题,将参数设置为std::list<Team> &a。然后可以安全地返回迭代器。