Russian Qt Forum

Qt => Общие вопросы => Тема начата: OKTA от Март 28, 2013, 17:46



Название: QString value
Отправлено: OKTA от Март 28, 2013, 17:46
Товарищи! ПОдскажите, почему при компилировании нет ошибки на строке типа:
Код:
QString value = value;

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


Название: Re: QString value
Отправлено: Bepec от Март 28, 2013, 18:33
На мой взгляд просто - вы вызываете конструктор объекта и передаёте ему ещё не созданный объект.
Т.е. попытка обратиться к членам класса до его создания.


Название: Re: QString value
Отправлено: Alex Custov от Март 28, 2013, 19:42
Товарищи! ПОдскажите, почему при компилировании нет ошибки на строке типа:
Код:
QString value = value;

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


покажи код целиком, прозреваю shadowing.


Название: Re: QString value
Отправлено: Bepec от Март 28, 2013, 22:05
Да, всё так как я и сказал )

Точнее - вылетает Qt-шный ассерт о том, что переданный объект в конструкторе не может быть this.


Название: Re: QString value
Отправлено: Igors от Март 29, 2013, 06:44
покажи код целиком, прозреваю shadowing.
Нет, эта конструкция (к сожалению) допустима и в др. компиляторах, хотя порядочные вякают варнингом типа "used before been initialized". Переменная value объявлена - да, ну значит сынтаксыс проходит


Название: Re: QString value
Отправлено: OKTA от Март 29, 2013, 12:49
understood)


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


Название: Re: QString value
Отправлено: Bepec от Март 29, 2013, 19:51
Код:
inline QString::QString(const QString &other) : d(other.d)
{ Q_ASSERT(&other != this); d->ref.ref(); }


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