Название: Указатель на родительский объект Отправлено: 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 //хотелось бы всё же заглянуть в глаза хэлперам-документалистам
в ноги им кланяйся лучше. и, попробуй такие вопросы им задавать на почту. когда узнают, что ты с рашки, возможно вспомнят роман Достоевского "Идиот" :) |