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

joh*_*een 3 c++ qt

我对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通过不返回任何内容来返回类型.


Luc*_*lon 5

这些被称为类的“ 前向声明 ”。它用于使编译器知道那些符号引用的类,这些类将在以后定义。可以在头文件中使用那些符号,以将符号声明为一个类,从而避免包含其头,在某些情况下可能需要这样做(例如,圆形包含)。

无论如何,您始终不能总是使用前向声明,因为编译器可能需要知道如何定义类。相反,在其他情况下,编译器仅需要知道它实际上是一个类这一事实。

编辑:要回答您添加的以下问题,请查看您可以在* 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成为完整的类型。