射击时从列表中删除外星人 - 找出循环; '表达式:不能增加结束列表迭代器'
Posted
技术标签:
【中文标题】射击时从列表中删除外星人 - 找出循环; \'表达式:不能增加结束列表迭代器\'【英文标题】:Deleting Aliens from a List When Shot - figuring out loops; 'Expression : cannot increment end list iterator'射击时从列表中删除外星人 - 找出循环; '表达式:不能增加结束列表迭代器' 【发布时间】:2019-04-14 07:45:41 【问题描述】:我问了一个关于这个项目的问题previously(这不是同一个问题),但我正在模仿 Space Invaders 来完成一项任务。我几乎一切正常,但我遇到了子弹外星人交互的问题。我是列表的新手,所以如果这是一个明显的问题,我深表歉意。 :)
我有一个功能可以让外星人在与子弹相交时消失,但是当子弹杀死其中两个时,或者如果子弹飞过他们并消失,程序就会陷入无限循环(外循环) .
这是涉及的功能:
(如果您需要查看其他课程的任何内容,我也可以添加)
void alienGroupMgr::disappear(shotMgr m)
// shotMgr is just a class that manages the bullet data (vector of ptrs to bullets)
// getSprite returns data about individual sprites
for (list<alien*>::iterator iter = theGang.begin();iter != theGang.end();) // each alien
alien* ptrShot = *iter;
FloatRect alienBound = ptrShot->getSprite().getGlobalBounds();
// theGang is a list of ptrs to aliens from the alien group mgr class
// alien is a class for each alien
for (int i = 0; i < m.getAmountFilled(); i++) // each bullet
// getlist returns an index from the vector of bullet ptrs
FloatRect bulletBound = m.getList(i)->getSprite().getGlobalBounds();
if (alienBound.intersects(bulletBound))
iter = theGang.erase(iter);
else
iter++;
我测试了一个版本的函数,我通过使用计数器将外循环限制为 9 次。它在一半的时间工作,另一半,它给出一个错误,说“表达式:不能增加结束列表迭代器”。
我真的很感激一些建议!谢谢。
【问题讨论】:
我认为您应该在第二个循环中测试结束,例如条件中的iter != theGang.end()
。 iter
似乎超出了结尾,因为您没有在第二个循环中检查它。
【参考方案1】:
您在内部循环中有那条 iter++ 行似乎很奇怪。
例如,想想没有子弹与任何外星人相交的情况。然后我猜您希望代码遍历所有组合,但这不会发生,因为每次没有交集时都会发生 iter++ 行。
我建议不要在内部循环中从 theGang 中删除,而是在内部循环之前使用一个为 false 的 bool 变量,如果你发现与任何项目符号的交集,则将其设置为 true。然后,在内循环之后,检查 bool 变量,看看是否应该删除外星人。然后更容易看到代码在做什么:首先检查外星人是否被任何子弹击中,如果被击中则移除外星人。
【讨论】:
以上是关于射击时从列表中删除外星人 - 找出循环; '表达式:不能增加结束列表迭代器'的主要内容,如果未能解决你的问题,请参考以下文章