C++ Qt5中的类声明和名称空间
以下各项之间有什么区别:C++ Qt5中的类声明和名称空间,c++,qt,C++,Qt,以下各项之间有什么区别: namespace Ui { class T; } class T { //some content }; 及 我使用QtCreator,第一个构造用于为QtGUI应用程序生成的默认代码。在示例项目中,我有两个类:类MyDialog:public QDialog和类MainWindow:public QMainWindow每个类的私有部分都包含指向类的指针: class T: public Q { private: Ui::T
namespace Ui
{
class T;
}
class T
{
//some content
};
及
我使用QtCreator,第一个构造用于为QtGUI应用程序生成的默认代码。在示例项目中,我有两个类:类MyDialog:public QDialog和类MainWindow:public QMainWindow每个类的私有部分都包含指向类的指针:
class T: public Q
{
private:
Ui::T *pointer;
}
这种建设的目的是什么?
当MainWindow类还包含指向MyDialog类的指针时,该指针不能包含Ui::限定符:
private:
Ui::MainWindow *ui;
MyDialog *mDialog;
为什么?名称空间是用来保护代码不受类别名的影响的,如果您将类包装在名称空间中,则只能通过使用该名称空间来访问它,因此“class t”与“namespace::class t”不同有趣的问题,我以前没有注意到这个事实,可能是因为通常更喜欢通过代码构建Ui对象 无论如何,该构造用于避免生成“服务”类名:例如,从我的实际.h生成
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
...
private:
Ui::Dialog *ui;
}
注意Ui::Dialog*Ui代码>:这是由顶部声明(位于命名空间Ui内)转发的实际类。因此,请避免构建任意符号
我想这是个好把戏
这个转发类隐藏了GUI运行时构造所需的详细信息:您可以在构建目录a.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
QT_BEGIN_NAMESPACE
class Ui_Dialog
{
public:
QVBoxLayout *verticalLayout;
QTabWidget *tabWidget;
...
};
namespace Ui {
class Dialog: public Ui_Dialog {};
} // namespace Ui
QT_END_NAMESPACE