Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用指针从std::list中删除项_C++_List_Pointers_Stdlist - Fatal编程技术网

C++ 使用指针从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(); }

是否可以使用.remove和对象作为指针从std::list中删除对象

我对指针感到很困惑。 例如,我有以下课程:

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的扩展。。