我对C++没有太多经验,我对Qt文档中的以下几行有疑问:http://qt-project.org/doc/qt-4.8/mainwindows-application-mainwindow-h.html(第4行-6在顶部评论后)
class QAction;
class QMenu;
class QPlainTextEdit;
Run Code Online (Sandbox Code Playgroud)
由于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类的定义.
Ker*_* SB 11
声明一个类,而不是定义它,足以使编译器知道某个名称引用某个类型的事实,并允许您在某些设置中使用该类型.具体来说,声明但尚未定义的类型是不完整类型,您可以通过多种方式使用不完整类型:
在函数声明中,函数的返回类型和参数类型可能不完整(但当然不在函数的定义中).*
如果T是一个不完整的类型,那么T*和T&,以及他们的简历合格的版本,是完全类型.
所以你可以写下面的内容:
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
Run Code Online (Sandbox Code Playgroud)
您可以根据需要随时声明类或任何类型的类.唯一必须是唯一的是定义("一个定义规则").
*)有一个例外:void始终不完整,并且您可以void通过不返回任何内容来返回类型.
这些被称为类的“ 前向声明 ”。它用于使编译器知道那些符号引用的类,这些类将在以后定义。可以在头文件中使用那些符号,以将符号声明为一个类,从而避免包含其头,在某些情况下可能需要这样做(例如,圆形包含)。
无论如何,您始终不能总是使用前向声明,因为编译器可能需要知道如何定义类。相反,在其他情况下,编译器仅需要知道它实际上是一个类这一事实。
编辑:要回答您添加的以下问题,请查看您可以在* qt_install_dir * / include / QtGui中找到的QtGui文件。在我的Qt 4.8安装中,我看到了里面:
#include "qaction.h"
Run Code Online (Sandbox Code Playgroud)
然后看一下qaction.h:您将看到QAction类的完整定义。头文件QtGui的包含就在mainwindow.cpp的开头,这使QAction成为完整的类型。