Russian Qt Forum

Qt => Вопросы новичков => Тема начата: redbaron от Июль 14, 2013, 14:51



Название: Указатель на родительский объект
Отправлено: redbaron от Июль 14, 2013, 14:51
Всем доброго времени суток.
У меня следующий вопрос.
Возможно, я упускаю что-то совершенно простое, но всё же...
В некоторых примерах официальной документации при создании собственного класса в конструкторе передаётся указатель на родительский объект, необходимый для конструктора наследуемого класса и создании иерархии объектов.
Например, в заголовочном файле:

class ClassWizard : public QWizard
 {
     Q_OBJECT

 public:
     ClassWizard(QWidget *parent = 0);

......


А затем в определении класса:

ClassWizard::ClassWizard(QWidget *parent)
     : QWizard(parent)
.....


Но в некоторых случаях указатель не передаётся. Например:

class MainWindow : public QMainWindow
 {
     Q_OBJECT

 public:
     MainWindow();

.....



MainWindow::MainWindow()
 {
.....


Хотя конструктор QMainWindow так же, как и QWizard, принимает параметр указателя на родительский объект, здесь это не делается. Почему?

Заранее спасибо. :)


Название: Re: Указатель на родительский объект
Отправлено: kambala от Июль 14, 2013, 15:11
если не вызывать конструктор базового класса, то будет автоматически вызван его конструктор по умолчанию. в данном случае это будет QMainWindow(0).


Название: Re: Указатель на родительский объект
Отправлено: redbaron от Июль 14, 2013, 16:40
если не вызывать конструктор базового класса, то будет автоматически вызван его конструктор по умолчанию. в данном случае это будет QMainWindow(0).

Да, это понятно, но вопрос в том, почему в одном случае их устраивает вызов по умолчанию, а в другом принципиален вызов с указателем?


Название: Re: Указатель на родительский объект
Отправлено: kambala от Июль 14, 2013, 18:03
в конструктор ClassWizard может быть передан параметр, а может быть и не передан (тогда будет 0), поэтому вызывают базовый конструктор явно. в MainWindow же конструктор и так без параметров, а значит ничего иного кроме как QMainWindow(0) вызвано быть не может.


Название: Re: Указатель на родительский объект
Отправлено: redbaron от Июль 14, 2013, 18:37
в конструктор ClassWizard может быть передан параметр, а может быть и не передан (тогда будет 0), поэтому вызывают базовый конструктор явно. в MainWindow же конструктор и так без параметров, а значит ничего иного кроме как QMainWindow(0) вызвано быть не может.

Ага. Понятно. Спасибо.
Просто интересны были доводы составителей.
В чём был смысл обреза MainWindow? Сэкономили? ))
Неужели указание родителя в нём было таким неприемлемым?
Чем, собственно говоря, ClassWizard или ClassDialog лучше MainWindow?

class MainWindow: public QMainWindow {
  Q_OBJECT

public:

MainWindow(QWidget* parent)

.....

}

MainWindow::QMainWindow(QWidget* parent = 0) : QMainWindow(parent)

{....}
И что же здесь плохого?


Название: Re: Указатель на родительский объект
Отправлено: kambala от Июль 14, 2013, 19:30
ничего плохого нету, просто сэкономили несколько символов. хотя я предпочитаю всегда прописывать вызов базового конструктора.

как правило, QMainWindow является основным окном (окном верхнего уровня), которое создается в main(), поэтому родителя у него быть и не может.


Название: Re: Указатель на родительский объект
Отправлено: redbaron от Июль 14, 2013, 20:07
ничего плохого нету, просто сэкономили несколько символов. хотя я предпочитаю всегда прописывать вызов базового конструктора.

как правило, QMainWindow является основным окном (окном верхнего уровня), которое создается в main(), поэтому родителя у него быть и не может.

Фух, ну просто отлегло, спасибо большое. А то весь день промучился с этой заморочкой  :)

А насчёт верхнего уровня - это просто мистика какая-то (хотелось бы всё же заглянуть в глаза хэлперам-документалистам), ибо даже в тех приложениях, где создаваемый объект на самом что ни на есть верхнем уровне, в конструкторах классов они прописывают указатель parent.
Как сказал бы Шарик из Простоквашино: "Потому что так красивее"  :D
Ну, наверное, на всякий пожарный...


Название: Re: Указатель на родительский объект
Отправлено: kambala от Июль 14, 2013, 20:19
А насчёт верхнего уровня - это просто мистика какая-то (хотелось бы всё же заглянуть в глаза хэлперам-документалистам), ибо даже в тех приложениях, где создаваемый объект на самом что ни на есть верхнем уровне, в конструкторах классов они прописывают указатель parent.
просто пишут конструкторы с такой же сигнатурой, какая и в базовом классе — по-моему это правильно. к тому же, никто не запрещает делать QMainWindow дочерним окном.


Название: Re: Указатель на родительский объект
Отправлено: thechicho от Июль 14, 2013, 22:06
//хотелось бы всё же заглянуть в глаза хэлперам-документалистам
в ноги им кланяйся лучше.
и, попробуй такие вопросы им задавать на почту. когда узнают, что ты с рашки, возможно вспомнят роман Достоевского "Идиот"  :)