C++ 使用指针从std::list中删除项
是否可以使用.remove和对象作为指针从std::list中删除对象 我对指针感到很困惑。 例如,我有以下课程:C++ 使用指针从std::list中删除项,c++,list,pointers,stdlist,C++,List,Pointers,Stdlist,是否可以使用.remove和对象作为指针从std::list中删除对象 我对指针感到很困惑。 例如,我有以下课程: class AsteroidGen{ public: std::list<Asteroid*> listAsteroids; void AsteroidGen::generateAsteroid(int amount, int delet); void AsteroidGen::DrawAsteroids(); }
class AsteroidGen{
public:
std::list<Asteroid*> listAsteroids;
void AsteroidGen::generateAsteroid(int amount, int delet);
void AsteroidGen::DrawAsteroids();
};
class-gen{
公众:
列出小行星;
void asterogen::generateAsteroid(整数金额,整数删除);
void AsteroidGen::drawsteroids();
};
有一个指向小行星的指针列表。
因为它是一个指针,我假设我可以使用指针遍历它并删除它
在我的主类中,我创建了AsteroidGen的一个实例,填充列表并绘制它。这一切都很好。然后,我尝试从我的项目符号与之冲突的列表中删除其中一项:
bool CheckBulletCollision(Lazer lazer, AsteroidGen asteroids){
bool collision = false;
for each(Asteroid *c in asteroids.listAsteroids){
Position pos = c->pos;
float lazx = lazer.mPos.x;
float lazy = lazer.mPos.y;
float lazz = lazer.mPos.z;
float distance = sqrt(pow(pos.x - lazx, 2) + pow(pos.y - lazy, 2) + pow(pos.z - lazz, 2));
if( distance < 2.05){
asteroids.listAsteroids.remove(c);
lazergone = true;
break;
}
}
return collision;
}
bool checkbullet碰撞(雷泽雷泽,小行星){
布尔碰撞=假;
每个(小行星中的小行星*c。列出小行星){
位置pos=c->pos;
float lazx=lazer.mPos.x;
float lazy=lazer.mPos.y;
float lazz=lazer.mPos.z;
浮动距离=sqrt(功率(位置x-lazx,2)+功率(位置y-惰性,2)+功率(位置z-lazz,2));
如果(距离<2.05){
小行星。列出小行星。删除(c);
lazergone=正确;
打破
}
}
返回碰撞;
}
我试着逐行检查我的代码,看看哪里出了问题,但列表项实际上并没有在下一帧中删除。我可能没有正确使用指针,我仍然觉得它们很难
有人能给我一些建议吗!
如果我需要添加更多代码,请告诉我,我认为这就足够了
谢谢。您正在按值将
asteroGen
传递到函数中。这意味着对其进行复制,并且函数在本地副本上工作,当函数结束时,本地副本将被丢弃。小行星确实已从列表中删除,但已从副本中存储的列表中删除
如果要修改函数中的gen
对象,必须通过引用传递:
bool CheckBulletCollision(Lazer lazer, AsteroidGen &asteroids) {
// ... rest of code as before
}
您正在按值将
gen
传递到函数中。这意味着对其进行复制,并且函数在本地副本上工作,当函数结束时,本地副本将被丢弃。小行星确实已从列表中删除,但已从副本中存储的列表中删除
如果要修改函数中的gen
对象,必须通过引用传递:
bool CheckBulletCollision(Lazer lazer, AsteroidGen &asteroids) {
// ... rest of code as before
}
代码中的每个(原文如此)都有一个
。那是什么?既然你要遍历列表,为什么不使用迭代器和std::list::erase
?这会更有效率。@jogojapan可能是MSVC扩展名。。代码中的每个
(原文如此)都有一个。那是什么?既然你要遍历列表,为什么不使用迭代器和std::list::erase
?“那会更有效率。”jogojapan可能是MSVC的扩展。。