C++中没有定义的类声明

Class declaration with no definition in C++

本文关键字:声明 定义 C++      更新时间:2023-10-16

我对C++没有太多经验,我对Qt文档中的以下几行有疑问:http://qt-project.org/doc/qt-4.8/mainwindows-application-mainwindow-h.html(顶部注释后的第4-6行)

 class QAction;
 class QMenu;
 class QPlainTextEdit;

既然QAction、QMenu和QPlainTextEdit是Qt的库类(点击它们会进入它们的文档页面),难道不应该使用"#include"来包含它们吗?仅仅用关键字"class"声明它们有什么用?在我看来,编译器会将其视为一个全新的类,与库类QAction无关。

但是,"mainwindow.cpp"文件(http://qt-project.org/doc/qt-4.8/mainwindows-application-mainwindow-cpp.html)不包含类QAction的任何定义,尽管它的对象正在代码中使用。

这是怎么回事?

编辑:问题的进一步解释

查看类MainWindow的createActions方法(http://qt-project.org/doc/qt-4.8/mainwindows-application-mainwindow-cpp.html)。这里正在创建类QAction的对象,但我找不到QAction类的定义。

声明类,而不是定义,足以让编译器意识到某个名称引用了一个类型,并允许您在某些设置中使用该类型。具体来说,已声明但尚未定义的类型是不完整类型,您可以通过以下几种方式使用不完整类型:

  • 在函数声明中,函数的返回类型和参数类型可能不完整(但当然不在函数的定义中)。*

  • 如果T是不完全类型,则T*T&以及它们的CV限定版本是完全类型。

所以你可以写以下内容:

class Foo;  // we only need to know that `Foo` names a type.
struct Bar { Foo * p; };   // complete definition of `Bar`.
Foo mangle(Foo x, Foo y);  // function declaration

您可以随时声明一个类或任何类型。唯一必须唯一的是定义(即"一个定义规则")。

*)有一个例外:void总是不完整的,并且您可以通过根本不返回任何内容来返回void类型

这些被称为类的"前向声明"。它用于让编译器知道这些符号指的是类,这些类将在以后定义。这些可以在头文件中用于声明符号为类,避免包含其头,这在某些情况下可能是需要的(例如循环包含)。

无论如何,不能总是使用正向声明,因为编译器可能需要知道类是如何定义的。在其他情况下,编译器只需要知道它实际上是一个类。

编辑:要回答您添加的以下问题,请查看您可以在*qt_install_dir*/include/QtGui中找到的QtGui文件。在我的Qt 4.8安装中,我看到里面:

#include "qaction.h"

然后查看qaction.h内部:您将看到qaction类的完整定义。头文件QtGui就在主窗口.cpp的开头,这使QAction成为一个完整的类型。

类的类型完全由其完全限定的名称决定(不确定这是官方术语,但无论如何),包括其名称空间和名称。它是来源于头文件还是简单地声明为原位并不重要。

事实上,头文件的包含基本上只是将该头的文本插入到源代码的包含点中。其效果与使用您喜爱的文本编辑器将#include替换为头文件的内容相同。无论哪种方式,编译器本身都只看到一个令牌流。

使用正向声明的主要目的是通过减少必须解析的文本量和在RAM中构建的符号表的大小来加快编译器的速度。我发现在我自己的工作中,这种做法在很大程度上是不必要的,但非常大的项目可能仍然会受益。

几天前我刚刚在处理这个例子。因此,以下是我认为你需要这些的结论:

我猜,如果你在.pro文件中查看,你会看到一行类似于:

QT += core
QT += gui

所以问题是你告诉Qt翻译器和编译器你正在使用QtGui和QtCore模块,在这些模块中你定义了QAction等。因此,作为"黑客"(因为他们的IDE在编译过程的后期才能自动检测到这一点),你可以预先声明类,以避免在编译阶段出现任何错误。最后,Qt插入模块,一切正常。

这也让我第一次这么做时头疼,但这是我能得到的唯一合乎逻辑的解释。

如果你不预先声明类,你会得到一个错误,说它找不到任何对类的引用等等。

编辑:根据你最近的更新,我建议你去YouTube上搜索一个昵称为voidrealms的用户。他有不错的C++Qt视频教程和解释,在那里他还展示了QMenu、QAction等。他有150多个Qt C++编程视频,涵盖了从基本的Hello World到网络编程的所有内容,甚至更多。。。看看他,他还有其他教程