C+中没有定义的类声明+; 我没有太多的C++经验,我有一个问题,关于QT文档中的下列几行:(顶部注释后的4-6行)< /P>

C+中没有定义的类声明+; 我没有太多的C++经验,我有一个问题,关于QT文档中的下列几行:(顶部注释后的4-6行)< /P>,c++,qt,C++,Qt,既然QAction、QMenu和QPlainTextEdit都是Qt的库类(点击它们会导致它们的文档页面),那么它们不应该使用“#include”来包含吗?仅仅用关键字“class”声明它们有什么用途?在我看来,编译器会将其视为一个全新的类,与库类QAction无关 但是,“mainwindow.cpp”文件()不包含类QAction的任何定义,尽管代码中正在使用它的对象 这是怎么回事 编辑:问题的进一步解释 查看类MainWindow()的createActions方法。这里创建了QActio

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

但是,“mainwindow.cpp”文件()不包含类QAction的任何定义,尽管代码中正在使用它的对象

这是怎么回事

编辑:问题的进一步解释


查看类MainWindow()的createActions方法。这里创建了QAction类的对象,但我找不到QAction类的定义。

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

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

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

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

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

  • 如果
    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"

h:您将看到qaction类的完整定义。头文件QtGui包含在mainwindow.cpp的开头,这使QAction成为一个完整的类型。

几天前我刚刚在处理这个示例。以下是我认为您需要这些产品的原因:

我猜如果您查看.pro文件,您会看到一行如下所示:

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

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

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

编辑:
鉴于你最近的更新,我建议你去YouTube,在nick:下搜索一个用户。他有不错的C++ QT视频教程,他还展示了Q菜单、QActut等。他在Qt C++编程上有150个视频,涵盖了从基本的Hello World到网络编程的一切,甚至更进一步…看看他,他还有其他教程

好的。我确实理解这个事实。但是,如果您查看类MainWindow()中createActions方法的第一行,就会调用QAction类的构造函数,尽管在任何地方都没有定义。如何调用尚未定义的方法?在主窗口文件中,它们包括。我还没有查过,但这不是真正的行动宣言吗?在我看来,也应该是这样的。但这是糟糕且令人困惑的编程。如果这是真的,那么文档应该清楚地说明这一点。虽然Qt是一个很好的跨平台框架,有着良好的文档,但我认为示例应该比它们更具描述性。然而,没有什么比艰苦的学习更令人兴奋的了:尝试和错误:如果你注意到
QT += core
QT += gui