Поиск:

Ответ в темуСоздание новой темы Создание опроса
> foreach Qt4 баг? foreach работает некорректно... ? 
:(
    Опции темы
zaytsewa
Дата 24.3.2011, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Всем привет!

Вчера заметила следующее:

есть
QVector<GLTriangle> triangles;

изначально конструктора по умолчанию у GLTriangle не было, но тогда компилятор ругался что не может поместить объекты типа GLTriangle в QVector
после этого я добавила пустой конструктор и метод setCoords(MnGis::GeoVector& v) с параметром, который должен быть в конструкторе 
[
Код

  for (int i = 0; i < vn.count();++i)
  {
   GLTriangle triangle(vn[i]);
   triangles.append(triangle); 
   triangles[i].setCoords(vn[i]);
  }


далее я инициализирую данные в объекте класса GLTriangle
Код

  GLTriangle triangle;
   foreach(GLTriangle triangle,triangles)
 {
     triangle.initBuffers();
   }



а тут я хотела получить объекты с заполненными данными, не тут-то было! Все объекты оказались без инициализированных данных....

Код

   GLTriangle triangle;
   foreach(GLTriangle triangle,triangles)
   {
     triangle.draw(program);
   }


использую по-старинке и всё работает

Код

   for (int i = 0; i < triangles.count();++i)
   {
     triangles[i].initBuffers();
  }


кто-нибудь объясните мне, почему так?


Это сообщение отредактировал(а) zaytsewa - 24.3.2011, 16:03
PM MAIL   Вверх
borisbn
Дата 24.3.2011, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(zaytsewa @  24.3.2011,  15:52 Найти цитируемый пост)

foreach(GLTriangle triangle,triangles)
{
    triangle.initBuffers();
}

Qt-шный foreach работает с копией объекта (или константной ссылкой).
изменять объекты при помощи Qt-шного foreach нельзя. 



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 24.3.2011, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Странный код:
Код
  for (int i = 0; i < vn.count();++i)
  {
   GLTriangle triangle(vn[i]);
   triangles.append(triangle); 
   triangles[i].setCoords(vn[i]);
  }
Зачем координаты два раза задаются? И почему нельзя использовать тут foreach:
Код
foreach(const Type &v, vn)
   triangles.append(GLTriangle(v));


Это сообщение отредактировал(а) bsa - 24.3.2011, 16:16
PM   Вверх
zaytsewa
Дата 24.3.2011, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



там дважды задаётся параметр, тк я сначала грешила на конструктор

Код

foreach(const Type &v, vn)
   triangles.append(GLTriangle(v));
    

у меня так не получилось, типа тут должен вызываться конструктор без параметра


Это сообщение отредактировал(а) zaytsewa - 24.3.2011, 16:39
PM MAIL   Вверх
_GRIN_
Дата 25.3.2011, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



"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 нельзя изменить содержимое оригинального контейнера!!!
При необходимости менять содержимое контейнера лучше использовать итераторы - это и работает быстрее =)


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
bsa
Дата 25.3.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(zaytsewa @  24.3.2011,  16:10 Найти цитируемый пост)
у меня так не получилось, типа тут должен вызываться конструктор без параметра

Если ты вместо Type укажешь тип элементов контейнера vn, то все должно работать. Иначе, твой код тоже не скомпилировался бы.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0504 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.