| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > foreach Qt4 баг? |
| Автор: zaytsewa 24.3.2011, 15:52 | ||||||||
| Всем привет! Вчера заметила следующее: есть QVector<GLTriangle> triangles; изначально конструктора по умолчанию у GLTriangle не было, но тогда компилятор ругался что не может поместить объекты типа GLTriangle в QVector после этого я добавила пустой конструктор и метод setCoords(MnGis::GeoVector& v) с параметром, который должен быть в конструкторе [
далее я инициализирую данные в объекте класса GLTriangle
а тут я хотела получить объекты с заполненными данными, не тут-то было! Все объекты оказались без инициализированных данных....
использую по-старинке и всё работает
кто-нибудь объясните мне, почему так? |
| Автор: bsa 24.3.2011, 16:10 | ||||
Странный код:
|
| Автор: zaytsewa 24.3.2011, 16:10 | ||
там дважды задаётся параметр, тк я сначала грешила на конструктор
у меня так не получилось, типа тут должен вызываться конструктор без параметра |
| Автор: _GRIN_ 25.3.2011, 16:13 |
| "Qt automatically takes a copy of the container when it enters a foreach loop. If you modify the container as you are iterating, that won't affect the loop. (If you do not modify the container, the copy still takes place, but thanks to implicit sharing copying a container is very fast.) Since foreach creates a copy of the container, using a non-const reference for the variable does not allow you to modify the original container. It only affects the copy, which is probably not what you want." Т.е. в foreach - проход осуществляется по копии контейнера, и внутри foreach нельзя изменить содержимое оригинального контейнера!!! При необходимости менять содержимое контейнера лучше использовать итераторы - это и работает быстрее =) |
| Автор: bsa 25.3.2011, 18:47 | ||
Если ты вместо Type укажешь тип элементов контейнера vn, то все должно работать. Иначе, твой код тоже не скомпилировался бы. |