Явный конструктор QDialog без аргумента - как правильно использовать?

Я испытал это с производным классом, но то же самое с базовым классом 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 )

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

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


person friedemann    schedule 25.06.2011    source источник
comment
Как показывают ответы, это не проблема, характерная для Qt или класса QDialog. Синтаксис вызова конструктора, не принимающего аргументов, в C++ отличается от, скажем, C#. Вы должны опустить круглые скобки, иначе компилятор решит, что вы объявляете функцию.   -  person Cody Gray    schedule 25.06.2011
comment
Кстати, вы неправильно используете термин explicit constructor. Вот что можно прочитать: msdn.microsoft.com/en-us/library/h1y7x448 .aspx   -  person Armen Tsirunyan    schedule 25.06.2011


Ответы (2)


QDialog dialog();

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

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

QDialog f();

Теперь это больше похоже на функцию, не так ли? :)

Тебе нужно

QDialog dialog;

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

person Armen Tsirunyan    schedule 25.06.2011
comment
Когда вы смотрите только на эту линию, это кажется довольно очевидным. Спасибо большое, я не понял - person friedemann; 25.06.2011

QDialog dialog;

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

person Mat    schedule 25.06.2011
comment
Спасибо, я должен был подумать об этом - person friedemann; 25.06.2011