Удалить элемент из std::list с помощью указателей

Можно ли удалить объект из std::list, используя.remove и объект в качестве указателя?

Я запутался в указателях. У меня есть следующий класс, например:

class AsteroidGen{
    public:
        std::list<Asteroid*> listAsteroids;
        void AsteroidGen::generateAsteroid(int amount, int delet);
        void AsteroidGen::DrawAsteroids();
};

У этого есть список указателей на мой объект астероида. Поскольку это указатель, я предполагаю, что смогу пройти через него с помощью указателей и удалить его.

В моем основном классе я создаю экземпляр 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;
}

я пытался построчно проходить через мой код, чтобы увидеть, что идет не так, но элемент списка фактически не удаляется в следующем кадре. Я, вероятно, не правильно использую указатели, я все еще считаю их трудными.

Может кто-нибудь дать мне совет, пожалуйста! Скажите, если мне нужно добавить больше кода, я предположил, что этого будет достаточно. Спасибо.

1 ответ

Решение

Вы проходите AsteroidGen в функцию по значению. Это означает, что его копия сделана, и функция работает с локальной копией, которая отбрасывается по завершении функции. Астероид действительно удален из списка, но из списка, сохраненного в копии.

Если вы хотите изменить AsteroidGen Объект в функции, вы должны передать его по ссылке:

bool CheckBulletCollision(Lazer lazer, AsteroidGen &asteroids) {
  // ... rest of code as before
}
Другие вопросы по тегам