这个问题很好,一个最简单的Qt项目中有4个文件,我们来看看mainwindow.h和cpp的代码:

    Qt头文件引入两个namespace Ui的解释 - 图1

    1.mainwindow.h

    1. #ifndef MAINWINDOW_H
    2. #define MAINWINDOW_H
    3. #include <QMainWindow>
    4. //这句话的意思,先声明一个在Ui命名空间的名为MainWindow的未定义的的类,现在只是一个声明而已
    5. namespace Ui {
    6. class MainWindow;
    7. }
    8. class MainWindow : public QMainWindow
    9. {
    10. Q_OBJECT
    11. public:
    12. explicit MainWindow(QWidget *parent = 0);
    13. ~MainWindow();
    14. private:
    15. Ui::MainWindow *ui;//使用了刚才在Ui命名空间定义的类
    16. };
    17. #endif // MAINWINDOW_H

    2.mainwindow.cpp

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include <QDragEnterEvent>
    4. #include <QUrl>
    5. #include <QFile>
    6. #include <QTextStream>
    7. #include <QMimeData>
    8. MainWindow::MainWindow(QWidget *parent) :
    9. QMainWindow(parent),
    10. ui(new Ui::MainWindow)//此处也用了一个Ui
    11. {
    12. ui->setupUi(this);
    13. setAcceptDrops(true);
    14. }
    15. MainWindow::~MainWindow()
    16. {
    17. delete ui;
    18. }

    解释:.cpp文件同时引入了两个头文件

    而且它们里面都有命名空间Ui,类名也相同,但是这两者有重大区别,一个是声明,一个是定义!!!!!

    1. 1.mainwindow.cpp中引入"mainwindow.h中"MainWindow是声明,如下:
    2. namespace Ui {
    3. class MainWindow;
    4. }
    5. 2.mainwindow.cpp中引入的"ui_mainwindow.h"MainWindow是定义,如下:
    6. namespace Ui {
    7. class MainWindow: public Ui_MainWindow {};
    8. } // namespace Ui

    两个命名空间虽然同名,而且类名也相同,但是一个是声明,一个是定义,可以有无数个声明,但是只能有一个定义,所以编译不会报错!!

    我还看到过很多人有一种不好的习惯,就是喜欢在类内部定义一些嵌套类,美其名曰“高内聚”。但恰恰相反,这些内部类反而与上级类形成了强耦合关系,也是另一种形式的“万能类”。其实,这本来是名字空间该做的事情,用类来实现就有点“越权”了。正确的做法应该是,定义一个新的名字空间,把内部类都“提”到外面,降低原来类的耦合度和复杂度。
    1. namespace xxx {
    2. class inner_class {...};
    3. class big_class {...};
    4. }