相当简单的问题。
我有一个Bullet对象,当子弹与一个物体碰撞时,它被摧毁并从一个子弹矢量中移除。
每个Bullet对象都有一个对子弹矢量/列表的引用。
如果发生这种情况,如何使用Bullet类中的 this 关键字将其删除?
void collide(){
//error C2678: binary '==': no operator found which takes a left-hand operand of type 'Bullet'
//(or there is no acceptable conversion)
bullets->erase(std::remove(bullets->begin(), bullets->end(), *this), bullets->end());
}
所以是的,代码给了我一个奇怪的错误。 我需要知道如何在不使用while / for循环迭代子弹矢量并且仅使用矢量函数的情况下执行此操作。显然,当前的方法不起作用,因为它在代码中注释了错误。
我也尝试使用find()而不是remove(),同样的错误。
答案 0 :(得分:2)
您需要在项目符号类中实现==运算符。 如果你想根据它的内存地址删除一个项目,你可以简单地遍历这个向量并找到天真的元素:
for (Bullet& bullet : bullets){
if (&bullet == this){
bullets.erase(bullet);
break;
}
}
答案 1 :(得分:2)
试试这个:
std::remove_if( bullets.begin(), bullets.end(),
[this] (const Bullet& s) {
if (&s == this)
return true;
return false;
}
);
答案 2 :(得分:1)
您需要获取要擦除的对象的迭代器。你可以通过使用第一个和当前对象之间的差异来获得它:
bullets->erase(bullets->begin() + (this - &bullets.front()));
请注意,这将破坏您当前正在执行其方法的对象,即之后您无法访问任何成员的对象。