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

1.mainwindow.h
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>//这句话的意思,先声明一个在Ui命名空间的名为MainWindow的未定义的的类,现在只是一个声明而已namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private:Ui::MainWindow *ui;//使用了刚才在Ui命名空间定义的类};#endif // MAINWINDOW_H
2.mainwindow.cpp
#include "mainwindow.h"#include "ui_mainwindow.h"#include <QDragEnterEvent>#include <QUrl>#include <QFile>#include <QTextStream>#include <QMimeData>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)//此处也用了一个Ui{ui->setupUi(this);setAcceptDrops(true);}MainWindow::~MainWindow(){delete ui;}
解释:.cpp文件同时引入了两个头文件
而且它们里面都有命名空间Ui,类名也相同,但是这两者有重大区别,一个是声明,一个是定义!!!!!
1.mainwindow.cpp中引入"mainwindow.h中"中MainWindow是声明,如下:namespace Ui {class MainWindow;}2.mainwindow.cpp中引入的"ui_mainwindow.h"中MainWindow是定义,如下:namespace Ui {class MainWindow: public Ui_MainWindow {};} // namespace Ui
两个命名空间虽然同名,而且类名也相同,但是一个是声明,一个是定义,可以有无数个声明,但是只能有一个定义,所以编译不会报错!!
我还看到过很多人有一种不好的习惯,就是喜欢在类内部定义一些嵌套类,美其名曰“高内聚”。但恰恰相反,这些内部类反而与上级类形成了强耦合关系,也是另一种形式的“万能类”。其实,这本来是名字空间该做的事情,用类来实现就有点“越权”了。正确的做法应该是,定义一个新的名字空间,把内部类都“提”到外面,降低原来类的耦合度和复杂度。
namespace xxx {class inner_class {...};class big_class {...};}
