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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Что такое "clean constructor"?  (Прочитано 5488 раз)
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« : Ноябрь 25, 2010, 19:47 »


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

Что такое "clean constructor" вообще?  Непонимающий
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Ноябрь 25, 2010, 21:37 »

Точно не знаю, но могу предположить о важности конструкторов вида MyWidget(QWidget *parent = 0) : QWidget(parent);
Т.к. если такогово не будет, то произойдет утечка памяти.

P.S. Если я что-то не так понимаю, поправьте меня пожалуйста Улыбающийся
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #2 : Ноябрь 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.)
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #3 : Ноябрь 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).
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #4 : Ноябрь 28, 2010, 16:55 »

Новая находка!  Шокированный

Clean constructor - widget properties are now set within the designer

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



Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #5 : Ноябрь 29, 2010, 13:19 »

Итого:

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

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

Кто сдавал сертификацию - сабжевый вопрос не возникал? Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Ноябрь 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'ы а конструктор "не совсем"
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #7 : Ноябрь 29, 2010, 15:07 »

Igors,

Я склоняюсь к первому варианту, т.к. оно подходит для юзания в дизайнере
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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