【发布时间】:2013-07-15 09:14:02
【问题描述】:
我正在尝试创建一个垂直滚动的射击游戏,当你按下空格键时会创建一个子弹,然后当子弹离开屏幕时,子弹会被摧毁。我通过标记为vector<BULLET> bullets; 的向量跟踪子弹当我尝试销毁屏幕外的任何子弹时,我会遇到大量错误,例如:
c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\include\c++\bits\stl_algobase.h|384| required from '_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = true; _II = BULLET*; _OI = BULLET*]'|
我的代码如下所示:
for( auto it = bullets.begin(); it != bullets.end(); ){
if( it->is_dead()){
it = bullets.erase(it);
}else{
it++;
}
}
让我感到沮丧的部分是我有类似的循环,它删除任何需要在包含指针的向量中删除的游戏对象:
for( auto it = activeInstances.begin();
it != activeInstances.end(); ){
if( (*it)->is_dead()){
it = activeInstances.erase(it);
}else{
it++;
}
}
这个工作得很好。
编辑:我不确定它是否有区别,但仅供参考,我将稍后出现在向矢量添加项目符号的同一函数中添加部分:
if( key[SPACE] && reload == 0){
reload = reloadTime;
BULLET newBullet;
newBullet.init( x, y);
bullets.push_back( newBullet);
}
【问题讨论】:
-
BULLET 有移动构造函数吗?
-
也许你应该替换 if( it->is_dead()){ 与来自波纹管循环的完全相同的代码 if( (*it)->is_dead()){ ... 你必须访问对象在迭代器中,您可以使用 *it
-
it->对访问迭代器的对象是有效的,但如果向量中的对象本身是点类型,则您必须通过(*it)->进行实际上取消引用两次:迭代器和迭代器持有的任何类型。 BULLET 是指针类型吗? -
你有非公开的复制或移动构造函数吗?
-
我确实尝试将
it->is_dead()更改为(*it)->is_dead()只是为了确保这不是问题并且会引发错误,因为项目符号是 BULLET 的向量,而 activeInstances 是 *OBJECT