没有参数的QDialog显式构造函数 - 如何正确使用?

时间:2011-06-25 14:00:25

标签: c++ qt constructor explicit 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 )

那么前两个例子不应该完全一样吗?为什么编译器会抱怨第二行,而不是构造函数。

感谢您的启发,提示进一步阅读该主题非常受欢迎

2 个答案:

答案 0 :(得分:8)

QDialog dialog();

这声明了一个名为dialog的函数,它不带任何内容并返回QDialog

如果您感到惊讶,假设您将变量f命名为对话框而不是对话框。我们得到了什么?

QDialog f();

现在看起来更像是一个功能,不是吗? :)

你需要

QDialog dialog;

总是,当某些东西可以解释为声明和其他东西时,编译器总是解决歧义,而不是声明

答案 1 :(得分:2)

QDialog dialog;

是使用默认构造函数在堆栈上创建QDialog的正确语法。