Можно ли удалить объект из 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;
}
я пытался построчно проходить через мой код, чтобы увидеть, что идет не так, но элемент списка на самом деле не удаляется в следующем кадре. Я, вероятно, не правильно использую указатели, я все еще нахожу их трудными.
Может кто-нибудь дать мне совет, пожалуйста!
Скажите, если мне нужно добавить больше кода, я предположил, что этого будет достаточно
Спасибо.
Вы проходите AsteroidGen
в функцию по значению. Это означает копия из этого сделано, и функция работает на локальной копии, которая отбрасывается, когда функция заканчивается. Астероид действительно удален из списка, но из списка, сохраненного в копия.
Если вы хотите изменить AsteroidGen
Объект в функции, вы должны передать его по ссылке:
bool CheckBulletCollision(Lazer lazer, AsteroidGen &asteroids) {
// ... rest of code as before
}
Других решений пока нет …