Russian Qt Forum

Qt => Общие вопросы => Тема начата: vipet от Ноябрь 25, 2010, 19:47



Название: Что такое "clean constructor"?
Отправлено: vipet от Ноябрь 25, 2010, 19:47

В Qt Essentials Curriculum Block есть тема "Writing your own widgets" и подраздел "Understand the importance of clean constructors".

Что такое "clean constructor" вообще?  ???


Название: Re: Что такое "clean constructor"?
Отправлено: kibsoft от Ноябрь 25, 2010, 21:37
Точно не знаю, но могу предположить о важности конструкторов вида MyWidget(QWidget *parent = 0) : QWidget(parent);
Т.к. если такогово не будет, то произойдет утечка памяти.

P.S. Если я что-то не так понимаю, поправьте меня пожалуйста :)


Название: Re: Что такое "clean constructor"?
Отправлено: vipet от Ноябрь 26, 2010, 15:51
Есть мнение, что это конструктор, который обеспечивают корректный clean-up за собой в случае, если сгенерировано исключение.

Например,
class C
{
  SomeClass* m_p1;
  SomeClass* m_p2;
public:
  C() : m_p1(new SomeClass), m_p2(new SomeClass) {}
  ~C() { delete m_p1; delete m_p2;}
};

Если во время создания C второй “new SomeClass” генерит исключение, то память, выделенная для m_p1, не будет освобождена.
Выходом является перенос вызовов new в блок try..catch внутри конструктора, или (намного лучше) использование smart pointers для m_p1, m_p2, например, QScopedPointer.

Не совсем понятно, какое отношение это имеет напрямую к Qt. Возможно, целью является проверка знания того, что в Qt существуют smart pointers. Несмотря на то, что они появились там сравнительно недавно (начиная с 4.6).

((с) Vasily A.)


Название: Re: Что такое "clean constructor"?
Отправлено: vipet от Ноябрь 26, 2010, 15:54
Есть схожее мнение от симбиан разработчика, который сказал, что:

When you construct a new object with new, you often have to allocate sub-objects. An eventual leave in the constructor does not invoke the destructor, and there is no possibility to put the sub-objects in the cleanup stack. This problem originates in the C++ construction semantic, that does not take in account the cleanup stack.

The only solution is to perform the construction in two phases. In the first phase, we perform the construction in the constructor, but with the rule that a constructor can not leave. This mean a constructor cannot even allocate memory, since an eventual lack of this resource can cause a leaving.

The real construction, with the effective allocation of subobjects, is then performed by a method (conventionally named ConstructL) that CAN leave. The destructor must also be written in special way: must work either if the object was fully constructed (ConstructL called) or not (only the constructor called).


Название: Re: Что такое "clean constructor"?
Отправлено: vipet от Ноябрь 28, 2010, 16:55
Новая находка!  :o

Clean constructor - widget properties are now set within the designer

И пример кода
http://gitorious.org/serieswatcher/serieswatcher/commit/7f62aa3361c3d4d3f350772771dc70ed19516e6e





Название: Re: Что такое "clean constructor"?
Отправлено: vipet от Ноябрь 29, 2010, 13:19
Итого:

Нужно, чтобы присутствовал конструктор вида MyWidget(QWidget *parent = 0).

На 100% я все равно не уверен, но скорее всего это имеется в виду.

Кто сдавал сертификацию - сабжевый вопрос не возникал? :)


Название: Re: Что такое "clean constructor"?
Отправлено: Igors от Ноябрь 29, 2010, 14:28
Итого:

Нужно, чтобы присутствовал конструктор вида MyWidget(QWidget *parent = 0).
??? Не вижу никаких оснований для такого вывода. Из того что Вы же привели в этой теме, я понял:
Вариант 1: конструктор сразу начиняет виджет внутренностями
Код
C++ (Qt)
MyWidget::MyWidget( QWidget * parent )
{
mLab = new QLabel("Lab", this);
..
}
 

Вариант 2 ("чистый"): начинка выделена в др. метод (вне конструктора)
Код
C++ (Qt)
MyWidget::MyWidget( QWidget * parent ) :
 mLab(0)  
{
..
}
 
void MyWidget::InitUI( void )
{
mLab = new QLabel("Lab", this);
..
}
 
Так иногда приходится делать из др. соображений: напр InitUI может использовать virtual'ы а конструктор "не совсем"


Название: Re: Что такое "clean constructor"?
Отправлено: vipet от Ноябрь 29, 2010, 15:07
Igors,

Я склоняюсь к первому варианту, т.к. оно подходит для юзания в дизайнере