在两个不同的头中声明相同的命名空间,然后将它们包含在一个cpp中

时间:2014-01-12 22:32:45

标签: c++ qt namespaces forward-declaration

Holla,QtCreator自动生成的Qt 5项目文件在两个单独的头文件中有一个名为Ui的命名空间声明,它们都包含在一个cpp文件中

//mainwindow.h
namespace Ui {
class MainWindow;
}



//ui_mainwindow.h
namespace Ui {
class MainWindow: public Ui_MainWindow {};
int x;
}


//mainwindow.cpp
#include "ui_mainwindow.h"
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

} 

我想知道命名空间会发生什么?是否合并以及为什么不将其视为Class MainWindow的重新定义? 提前谢谢。

感谢您的回答&我找到了关于标题的article,包括

3 个答案:

答案 0 :(得分:4)

  1. 合并。

  2. 第一个class MainWindow;前向声明,这是非常有意的;它用于告诉编译器“有一个类似于那个的类,稍后我会定义它”。

    它很有用,因为前向声明允许您在没有完整类定义的情况下声明指针和引用,从而允许您在类之间打破依赖关系并在不真正需要的情况下保持要包含的标题。稍后(可选)将前向声明替换为通常的完整类定义。

答案 1 :(得分:2)

您可以根据需要随时打开命名空间。声明只是简单合并。这与它对全局命名空间的工作方式相同:您也可以在全局命名空间中声明多个标头名称。看到的声明只是所有声明的结合。

对于Ui::MainWindowmainwindow.h文件未提供定义。它只提供声明。您可以在翻译单元中随意声明一个类。 ui_mainwindow.h文件提供Ui::MainWindow定义。在一个翻译单元中,您只能获得一个类的定义

答案 2 :(得分:0)

  

合并了

这是正确的,与Qt无关。

这是通用的C ++命名空间行为。命名空间可以出现在多个文件中,以获得更好的模块化。

许多库使用一个大的命名空间来实现其功能,即使该功能分布在许多源文件和头文件中。

我建议阅读以下页面,了解有关命名空间的更多详细信息。他们肯定会有更长的时间和更详细的解释:

Namespaces

  

为什么不将其视为Class MainWindow的重新定义?

class MainWindow;

这只是一个前瞻性声明,你可以拥有任意数量。只要您只有一个定义,这是有效的。这样做的目的是加快编译速度,您不需要知道确切的类表示。

在这里,您可以了解更多有关前方声明的信息:

Forward declarations