Russian Qt Forum
Ноябрь 23, 2024, 23:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QString value  (Прочитано 4527 раз)
OKTA
Гость
« : Март 28, 2013, 17:46 »

Товарищи! ПОдскажите, почему при компилировании нет ошибки на строке типа:
Код:
QString value = value;

Но при этом программа вылетает на этой строке?
Записан
Bepec
Гость
« Ответ #1 : Март 28, 2013, 18:33 »

На мой взгляд просто - вы вызываете конструктор объекта и передаёте ему ещё не созданный объект.
Т.е. попытка обратиться к членам класса до его создания.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Март 28, 2013, 19:42 »

Товарищи! ПОдскажите, почему при компилировании нет ошибки на строке типа:
Код:
QString value = value;

Но при этом программа вылетает на этой строке?


покажи код целиком, прозреваю shadowing.
Записан
Bepec
Гость
« Ответ #3 : Март 28, 2013, 22:05 »

Да, всё так как я и сказал )

Точнее - вылетает Qt-шный ассерт о том, что переданный объект в конструкторе не может быть this.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Март 29, 2013, 06:44 »

покажи код целиком, прозреваю shadowing.
Нет, эта конструкция (к сожалению) допустима и в др. компиляторах, хотя порядочные вякают варнингом типа "used before been initialized". Переменная value объявлена - да, ну значит сынтаксыс проходит
Записан
OKTA
Гость
« Ответ #5 : Март 29, 2013, 12:49 »

understood)
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #6 : Март 29, 2013, 19:45 »

На мой взгляд просто - вы вызываете конструктор объекта и передаёте ему ещё не созданный объект.
Т.е. попытка обратиться к членам класса до его создания.
Давайте подумаем. В конструкции Type x=y выполняется копирующая инициализация объекта x значением y. Т.е. сначала создается объект x, а потом ему присваивается значение у. Таким образом, в приведенном примере производится инициализация объекта значением самого объекта. Не наказуемо.
Для выполнения этой операции используется копирующий конструктор, он объявляется как Type(const Type&). В нашем случае, это QString(const QString & other). Может, туда посмотреть?
Кстати, C++Builder это делает без ругани.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Bepec
Гость
« Ответ #7 : Март 29, 2013, 19:51 »

Код:
inline QString::QString(const QString &other) : d(other.d)
{ Q_ASSERT(&other != this); d->ref.ref(); }
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #8 : Март 29, 2013, 19:58 »

Код:
inline QString::QString(const QString &other) : d(other.d)
{ Q_ASSERT(&other != this); d->ref.ref(); }
Собственно, ч.т.д. Реализация. Разработчик запретил такую фигню. И флаг ему.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.066 секунд. Запросов: 22.