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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Указатель на родительский объект  (Прочитано 4676 раз)
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, принимает параметр указателя на родительский объект, здесь это не делается. Почему?

Заранее спасибо. Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июль 14, 2013, 15:11 »

если не вызывать конструктор базового класса, то будет автоматически вызван его конструктор по умолчанию. в данном случае это будет QMainWindow(0).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
redbaron
Гость
« Ответ #2 : Июль 14, 2013, 16:40 »

если не вызывать конструктор базового класса, то будет автоматически вызван его конструктор по умолчанию. в данном случае это будет QMainWindow(0).

Да, это понятно, но вопрос в том, почему в одном случае их устраивает вызов по умолчанию, а в другом принципиален вызов с указателем?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июль 14, 2013, 18:03 »

в конструктор ClassWizard может быть передан параметр, а может быть и не передан (тогда будет 0), поэтому вызывают базовый конструктор явно. в MainWindow же конструктор и так без параметров, а значит ничего иного кроме как QMainWindow(0) вызвано быть не может.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
redbaron
Гость
« Ответ #4 : Июль 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)

{....}
И что же здесь плохого?
« Последнее редактирование: Июль 14, 2013, 18:41 от redbaron » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Июль 14, 2013, 19:30 »

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

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
redbaron
Гость
« Ответ #6 : Июль 14, 2013, 20:07 »

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

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

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

А насчёт верхнего уровня - это просто мистика какая-то (хотелось бы всё же заглянуть в глаза хэлперам-документалистам), ибо даже в тех приложениях, где создаваемый объект на самом что ни на есть верхнем уровне, в конструкторах классов они прописывают указатель parent.
Как сказал бы Шарик из Простоквашино: "Потому что так красивее"  Веселый
Ну, наверное, на всякий пожарный...
« Последнее редактирование: Июль 14, 2013, 20:10 от redbaron » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Июль 14, 2013, 20:19 »

А насчёт верхнего уровня - это просто мистика какая-то (хотелось бы всё же заглянуть в глаза хэлперам-документалистам), ибо даже в тех приложениях, где создаваемый объект на самом что ни на есть верхнем уровне, в конструкторах классов они прописывают указатель parent.
просто пишут конструкторы с такой же сигнатурой, какая и в базовом классе — по-моему это правильно. к тому же, никто не запрещает делать QMainWindow дочерним окном.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
thechicho
Гость
« Ответ #8 : Июль 14, 2013, 22:06 »

//хотелось бы всё же заглянуть в глаза хэлперам-документалистам
в ноги им кланяйся лучше.
и, попробуй такие вопросы им задавать на почту. когда узнают, что ты с рашки, возможно вспомнят роман Достоевского "Идиот"  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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