Russian Qt Forum

Qt => Общие вопросы => Тема начата: AAXEE от Февраль 09, 2009, 22:25



Название: Что означает QWidget(parent) в списке инициализаторов?
Отправлено: AAXEE от Февраль 09, 2009, 22:25
Здравствуйте!
Во многих примерах при наследовании класса в реализации конструктора встречается вот такая конструкция( извините за тавтологию):
MyClass::MyClass(QWidget *parent)
    : QWidget(parent)
{
    // any code
}

Насколько я знаю, то что стоит после двоеточия называется списком инициализаторов. Но ведь в нем инициализируются поля. а тут не понятно чего.
Как понимать ТО, что выделено жирным?


Название: Re: Что означает QWidget(parent) в списке инициализаторов?
Отправлено: Hellraiser от Февраль 09, 2009, 22:40
Этот класс унаследован от QWidget и при выполнении его конструктора (MyClass) вначале будет вызван конструктор базового класса QWidget с параметром parent.


Название: Re: Что означает QWidget(parent) в списке инициализаторов?
Отправлено: AAXEE от Февраль 09, 2009, 22:50
Спасибо. Я и сам так предполагал.
Но все же в литературе подтверждения найти не смог=) Более того, повторюсь, написано, что после двоеточия должны идти поля, а не методы.


Название: Re: Что означает QWidget(parent) в списке инициализаторов?
Отправлено: Hellraiser от Февраль 09, 2009, 22:55
Первым после двоеточия к конструкторе унаследованного класса всегда идет конструктор базового.


Название: Re: Что означает QWidget(parent) в списке инициализаторов?
Отправлено: AAXEE от Февраль 09, 2009, 22:58
Хорошо, спасибо.
Попробую найти что-нибудь из литературы по этой теме.


Название: Re: Что означает QWidget(parent) в списке инициализаторов?
Отправлено: kuzulis от Февраль 10, 2009, 08:36
а я понимаю так, что то что выделено жирным - это просто для укорочения записи.. например:
есть класс:
*.h
Код:
class MyClass: public QObject
{
 Q_OBJECT
public:
   MyClass(int Param1, int Param2);
private:
   int Par1;
   int Par2;
};

и в реализации мы можем написать двумя путями:
1.
Код:
MyClass::MyClass(int Param1, int Param2)
{
   Par1 = Param1;
   Par2 = Param2;
}
2.
Код:
MyClass::MyClass(int Param1, int Param2)
: Par1(Param1), Par2(Param2)
{

}

Я так понимаю, что это одно и тоже... Но вот именно с параметром parent я тоже не знаю...

Изменится ли что нибудь если не писать : QWidget(parent) ?


Название: Re: Что означает QWidget(parent) в списке инициализаторов?
Отправлено: Rcus от Февраль 10, 2009, 08:54
http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6


Название: Re: Что означает QWidget(parent) в списке инициализаторов?
Отправлено: lit-uriy от Февраль 10, 2009, 11:14
>Изменится ли что нибудь если не писать : QWidget(parent) ?

долго ли попробовать?


Название: Re: Что означает QWidget(parent) в списке инициализаторов?
Отправлено: kuzulis от Февраль 10, 2009, 11:41
Не изменится :)


Название: Re: Что означает QWidget(parent) в списке инициализаторов?
Отправлено: Rcus от Февраль 10, 2009, 11:43
/*sigh*/
А если не писать то кто же parent ставить будет? И еще попробуйте унаследоваться от класса без конструктора по-умолчанию и не писать конструктор базового класса в списке инициализации :)


Название: Re: Что означает QWidget(parent) в списке инициализаторов?
Отправлено: Dendy от Февраль 11, 2009, 15:27
А parent не нужен!

Это в вас переходной возраст заговорил. Проблема отцов и детей. Детям кажется что они всё знают, а parent не нужен.

Установка родительского обьекта присутствует, так как это очень популярная операция. И чтобы не ошибиться её добавили в конструктор QObject, QWidget. Правила хорошего тона предполагают наличие в собственных классах конструктора, который передаст родительский обьект выше по цепочке унаследованных классов, вплоть до QObject. А зачем нужен этот самый parent - читайте в Ассистанте.