SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › урок 24. вопрос по удалению врага из списка.
В этой теме 1 ответ, 2 участника, последнее обновление Mario 7 года/лет, 8 мес. назад.
-
АвторСообщения
-
Всем доброго времени суток. После бессонной ночи раздумий решил написать. вот этот код
C++12345678910111213141516171819for (it = entities.begin(); it != entities.end(); ){Entity *b = *it;b->update(time);if (b->life == false){it = entities.erase(it); delete b;}else { it++; }/* (*it)->update(time);if ((*it)->life == false){delete *it; it = entities.erase(it);}else { it++; }*/}второй закоментированный вариант опробовал сам, и интересно узнать насколько он верный. Менял порядок следования delete и entities.erase и получал жуткий глюк при отладке, но в порядке где делит находится первый – все нормально работает. Теперь хочу блеснуть незнанием некоторых особенностей списка)) . Во-первых: что присваивается итератору (в закоментированном варианте) где происходит удаление итератора из списка, и почему используется именно такая конструкция? (непонимание закралось еще из книги Шилда и его справочника, но в целом книги хорошие), но даже сейчас не совсем понимаю. Поначалу не понял как конкретно добавляются враги в список через список указателей на базовый класс(больная тема эти указатели). Потом вроде более мение понял(но по-подробней если кто нибудь объяснит, то будет просто замечательно!)
з.ы. Спасибо за потраченое время на просмотр унылого поста)
В первом варианте не принципиально, что идет первым: it = entities.erase(it) или delete b, а вот втором принципиально. В момент it = entities.erase(it) происходят 2 операции – из списка вычеркивается элемент, и второе – текущий указатель присваивается следующему элементу списка.
Таким образом при
it = entities.erase(it); delete *it;
текущий указатель присваивается следующему элементу, а потом в delete *it ты удаляешь содежимое этого элемента – а на следующей итерации обращаешься по этой (уже несуществующей ссылке) в строчке (*it)->update(time); -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.