2012-03-17 105 views
2

没有定义,我没有太多的经验与C++和我有一个关于从Qt文档这里如下的问题:http://qt-project.org/doc/qt-4.8/mainwindows-application-mainwindow-h.html类声明在C++

class QAction; 
class QMenu; 
class QPlainTextEdit; 
(系4-6顶部的评论后)

由于QAction,QMenu和QPlainTextEdit是Qt的库类(点击它们导致它们的文档页面),不应该使用'#include'包含它们吗?用关键字'class'声明它们有什么用途?据我所知,编译器会将它视为一个全新的类,与库类QAction无关。

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

这是怎么回事?

编辑:问题

考查类主窗口(http://qt-project.org/doc/qt-4.8/mainwindows-application-mainwindow-cpp.html)的createActions方法中创建的进一步解释。在这里,类QAction的对象正在创建,但我无处可以找到QAction类的定义。

回答

0

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

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

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

11

声明一类,而不是定义它,足以让编译器知道,某名是指一个类型的事实,并允许您使用在特定的设置类型。具体而言,已宣告但尚未定义的类型是不完全类型,并可以以多种方式使用不完全类型:

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

  • 如果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类型。

+0

OKay。我明白这个事实。但是,如果您查看MainWindow类中的createActions方法的第一行(http://qt-project.org/doc/qt-4.8/mainwindows-application-mainwindow-cpp。HTML),QAction类的构造函数被调用,但没有任何地方被定义。你怎么能调用一个尚未定义的方法? – aakashbhowmick 2012-03-17 10:32:08

+1

在MainWindow文件中,它们#include 。我没有看过它,但是没有提到QAction的真正宣言? – deong 2012-03-17 11:20:12

3

这些被称为“”的类。它被用来使编译器知道这些符号指的是后面将要定义的类。这些可以在头文件中用来声明一个符号是一个类,避免包含它的头,这在某些情况下可能是需要的(例如循环包含)。

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

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

#include "qaction.h" 

然后往里qaction.h:你会看到的QAction类的完整定义。头文件QtGui包含在mainwindow.cpp的开头,这使得QAction成为一个完整的类型。

-2

前几天我刚刚开始研究这个例子。因此,这里的结论为什么我认为你需要这些:

我猜,如果你想看看在.pro文件中你会看到一条线,就像:

QT += core 
QT += gui 

所以事情你是在告诉Qt编译器和编译器你正在使用QtGui和QtCore模块,并且在那些模块中你已经定义了QAction等。因此,作为一个“黑客”(因为他们的IDE无法在编译过程的后期阶段自动检测到),所以您预先声明了这些类,以避免编译阶段发生任何错误。最后,Qt插入模块,一切正常。

第一次做这件事时,这让我很头疼,但这是我能得到的唯一合理解释。

如果不预先声明的类,你会得到一个错误,指出它无法找到类等

编辑任何参考: 在你最近更新的光,我建议您将转到YouTube并在昵称下搜索用户:voidrealms。他有很好的C++ Qt视频教程和解释,并且还展示了QMenu,QAction等。他拥有150多个关于Qt C++编程的视频,涵盖了从基本的Hello World一直到网络编程甚至更远的一切......检查他,他还有其他教程以及

+0

在我看来,它也必须是这样的。但这是糟糕而令人困惑的编程。如果这是真的,文件应该清楚地说明。 – aakashbhowmick 2012-03-17 10:35:13

+0

虽然Qt是一个很好的跨平台框架,并且具有体面的文档,但我认为这些示例应该更具描述性。然而,没有什么比通过艰难的方式学习更加困难:试验和错误:P – 2012-03-17 11:00:19

+0

另外,如果您注意到您不能使用网络模块或sql模块,除非您在.pro文件中指定它们,即使您将它们包含在程序,这有点令人困惑 – 2012-03-17 11:01:47