C++使用箭头运算符与vector指针时解引用报错如何解决
C++指针访问报错原因及解决方案
核心根因
两个报错的本质都是混淆了C++运算符的优先级:->和.的优先级高于解引用运算符*,你写的表达式运算顺序和预期不符。
问题1:*figur->teampos报错分析
错误原因
- 你定义的
Figur结构体中,teampos本身就是int类型成员,不是指针,不需要解引用。 figur是Figur*类型指针,用->访问成员的逻辑本身就等价于(*figur).成员,已经完成了对指针的解引用,不需要额外加*。- 你写的
*figur->teampos会先执行figur->teampos拿到int值,再尝试对int值解引用,属于非法操作,必然报错。
修复方案
直接删除多余的解引用符即可,你写的第二行figur->teampos = figur->spieler->GiveTeamPos();本身就是正确的赋值逻辑,第一行完全多余,可以直接删掉。
问题2:*figs.size()报错分析
错误原因
figs是std::vector<Figur*>*类型的指针,你写的*figs.size()会先执行figs.size(),尝试对指针本身调用size()方法,指针没有该类成员方法,所以报错。
除此之外你循环里的访问、删除逻辑也有多处指针使用错误:
figs[i]是对vector指针做偏移运算,不是访问vector内的元素*figs.erase(*figs.begin() + i)的写法也不符合迭代器操作规范
修复方案
访问指针指向的对象成员,要么给解引用逻辑加括号,要么直接用->运算符,修正后的循环代码如下:
std::vector<Figur*>* figs = &figur->spieler->SpawnField; for (int i = 0; i < figs->size(); ) { if ((*figs)[i] == figur) { i = figs->erase(figs->begin() + i); // erase返回下一个有效迭代器的下标,不用手动i++ } else { i++; } }
内容的提问来源于stack exchange,提问作者LazyYuki
相关产品推荐
相关产品推荐

