5

有什么区别:

namespace Ui
{
     class T;
}
class T
{
     //some content
}; 

namespace Ui
{
     class T 
     {
          //some content
     };
}

我使用 Qt Creator,第一个构造用于为 Qt Gui 应用程序生成的默认代码。在示例项目中,我有两个类:MyDialog 类:public QDialogMainWindow 类:public QMainWindow它们中的每一个都在私有部分中包含一个指向该类的指针:

class T: public Q
{
private:
          Ui::T *pointer;
}

这种建设的目的是什么?当 MainWindow 类还包含指向 MyDialog 类的指针时,该指针不能包含Ui::限定符:

private:
          Ui::MainWindow *ui;
          MyDialog *mDialog;

为什么 ?

4

2 回答 2

4

有趣的问题,我之前没有注意到这个事实,可能是因为通常更喜欢通过代码构建 Ui 对象。

无论如何,该构造用于避免生成“服务”类名:例如,来自我的实际 .h

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT
...
private:
    Ui::Dialog *ui;
}

请注意Ui::Dialog *ui;: 这是由顶部声明(在命名空间 Ui 内)转发的实际类。所以 QtCreator 避免构建任意符号。

一个不错的把戏,我想。

转发的类隐藏了 GUI 运行时构建所需的血腥细节:您会在构建目录中找到一个 .h(在我的情况下是 ui_dialog.h),其中包含例如

QT_BEGIN_NAMESPACE

class Ui_Dialog
{
public:
    QVBoxLayout *verticalLayout;
    QTabWidget *tabWidget;
...
};

namespace Ui {
    class Dialog: public Ui_Dialog {};
} // namespace Ui

QT_END_NAMESPACE
于 2013-10-10T19:55:32.320 回答
0

命名空间用于保护您的代码免受别名类的影响,如果您将类包装在命名空间中,则只能通过使用该命名空间来访问它,因此“class t”与“namespace::class t”不同

于 2013-10-10T18:51:45.090 回答