урок 24. вопрос по удалению врага из списка.

SFML и C++ Уроки \ Разработка игр Форумы SFML Graphics урок 24. вопрос по удалению врага из списка.

В этой теме 1 ответ, 2 участника, последнее обновление Mario Mario 8 года/лет, 9 мес. назад.

Просмотр 2 сообщений - с 1 по 2 (из 2 всего)
  • Автор
    Сообщения
  • #1254
    kochegar
    kochegar
    Участник
    Сообщений:6

    Зарегистрирован:
    16.05.2015

    Репутация:5

    Всем доброго времени суток. После бессонной ночи раздумий решил написать. вот этот код

    второй закоментированный вариант опробовал сам, и интересно узнать насколько он верный. Менял порядок следования  delete и entities.erase и получал жуткий глюк при отладке, но в порядке где делит находится первый – все нормально работает. Теперь хочу блеснуть незнанием некоторых особенностей списка)) . Во-первых: что присваивается итератору (в закоментированном варианте) где происходит удаление итератора из списка, и почему используется именно такая конструкция? (непонимание закралось еще из книги Шилда и его справочника, но в целом книги хорошие), но даже сейчас не совсем понимаю. Поначалу не понял как конкретно добавляются враги в список через список указателей на базовый класс(больная тема эти указатели). Потом вроде более мение понял(но по-подробней если кто нибудь объяснит, то будет просто замечательно!)

    з.ы. Спасибо за потраченое время на просмотр унылого поста)

    #1264
    +1
    Mario
    Mario
    Модератор
    Сообщений:5

    Зарегистрирован:
    21.04.2015

    Репутация:3

    В первом варианте не принципиально, что идет первым: it = entities.erase(it) или delete b, а вот втором принципиально. В момент it = entities.erase(it) происходят 2 операции – из списка вычеркивается элемент, и второе – текущий указатель присваивается следующему элементу списка.

    Таким образом при
    it = entities.erase(it); delete *it;
    текущий указатель присваивается  следующему элементу, а потом в delete *it ты удаляешь  содежимое этого  элемента – а на следующей итерации обращаешься по этой (уже несуществующей ссылке) в строчке (*it)->update(time);

Просмотр 2 сообщений - с 1 по 2 (из 2 всего)

Для ответа в этой теме необходимо авторизоваться.