Указатель на элемент в итерации по std :: list

Я работаю над очень простой игрой, и у меня есть коллекция объектов std :: list, относящихся к моей игре. Я объявил это как:

std::list<Target> targets;

Когда я повторяю его, используя

for (std::list<Target>::iterator iter = targets.begin(); iter != targets.end(); iter++) {
        Target t = *iter;
                t.move();
}

Мои объекты не обновляются в графическом интерфейсе. Однако, заменив повторяющийся цикл на targets.front().move(), мой единственный объект перемещается правильно. Я думаю, это потому, что я не перебираю коллекцию с помощью указателей. Кто-нибудь может объяснить, как это делается? Спасибо.


person tipu    schedule 26.11.2009    source источник


Ответы (1)


Вы копируете объекты, сделайте это так:

*iter.move()

Если вы используете Target t = *iter;, вы, по сути, делаете копию своего объекта и перемещаете его, вместо того, чтобы перемещать намеченный объект.

Как сказал xtofl (спасибо), вы также можете получить ссылку.

Target &t = *iter;
t.move();
person Arkaitz Jimenez    schedule 26.11.2009
comment
Что именно - ›делает? Я ищу указатели и вижу объяснения для & и *, но не - ›. Спасибо. - person tipu; 26.11.2009
comment
Я считаю, что *iter.move() имеет неправильный приоритет оператора; если вы хотите сделать это так, это должно быть (*iter).move(). Но -> проще. - person int3; 26.11.2009
comment
(*iter).move(); совпадает с iter->move();. Это просто синтаксический сахар, добавленный в C ++. - person lyricat; 26.11.2009
comment
(*iter).move() совпадает с iter->move(), потому что именно так эти операторы должны работать для list::iterator. Оператор -> является синтаксическим сахаром, только если он встроен в ->. Когда мы переходим к перегрузке, это совершенно другой оператор, а не синтаксический сахар. - person AnT; 26.11.2009