QDialog явный конструктор без аргументов - как правильно использовать? - PullRequest
4 голосов
/ 25 июня 2011

Я испытал это с производным классом, но то же самое с базовым классом QDialog:

когда я делаю

QDialog dialog();
dialog.exec();

компилятор жалуется

J:\...\mainwindow.cpp:-1: In member function 'void MainWindow::on_viewButton_pressed()':
J:\...\mainwindow.cpp:72: Fehler:request for member 'exec' in 'dialog', which is of non-class type 'QDialog()'

Это как-то связано с используемым конструктором, потому что, когда я делаю

QDialog dialog(0);
dialog.exec();

код компилируется без ошибок. Это также работает:

QDialog *dial = new QDialog();
dial->exec();

Итак. Это из-за явного конструктора?

Документация говорит, что это определено как

QDialog::QDialog ( QWidget * parent = 0, Qt::WindowFlags f = 0 )

Так не должны ли первые два примера делать то же самое? И почему компилятор жалуется на вторую строку, а не на конструктор.

Спасибо за просветление, советы для дальнейшего чтения по теме очень приветствуются

Ответы [ 2 ]

8 голосов
/ 25 июня 2011

QDialog dialog();

Это объявляет функцию с именем dialog, которая ничего не берет и возвращает QDialog

Если вас это удивит, предположим, вы назвали свою переменную f вместо диалога. Что мы получаем?

QDialog f();

Выглядит больше как функция, не так ли? :)

Вам нужно

QDialog dialog;

Всегда, когда что-то можно интерпретировать как объявление, а что-то еще, компилятор всегда решает неоднозначность в пользу объявления

2 голосов
/ 25 июня 2011
QDialog dialog;

- правильный синтаксис для создания QDialog в стеке с конструктором по умолчанию.

...