Удалить элемент из 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;
}

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

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

0

Решение

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

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

bool CheckBulletCollision(Lazer lazer, AsteroidGen &asteroids) {
// ... rest of code as before
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]