不能从列表中解引用的指针
Pointer not derefencable from a list
我有两个类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
。然后可以安全地返回迭代器。
- C++取消引用指针.为什么会发生变化
- 深层复制具有自引用指针的类
- Visual c ++,使用字符串引用/指针调用 dll 函数
- std::unordered_map::提取引用/指针失效
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 取消引用指针并立即为其分配变量,导致分段错误
- 如何获取指向类(而不是对象)的引用/指针
- 将类型参数传递给自引用指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 在析构函数内取消引用指针时出现分段错误
- 来自引用指针的内存泄漏
- 引用指针后面的值
- 无法取消引用指针
- 引用指针调用成员函数
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 取消引用指针以创建数组的副本
- 有关启动引用指针的引用的问题