Qt 5 中的类声明和命名空间
class declarations and namespaces in Qt 5
两者
之间有什么区别:
namespace Ui
{
class T;
}
class T
{
//some content
};
和
namespace Ui
{
class T
{
//some content
};
}
我使用Qt Creator,第一个构造用于为Qt Gui应用程序生成的默认代码。在示例项目中,我有两个类:类 MyDialog:公共 QDialog 和类 MainWindow:公共 QMainWindow 它们中的每一个都在私有部分中包含一个指向该类的指针:
class T: public Q
{
private:
Ui::T *pointer;
}
这种建设的目的是什么?当 MainWindow 类还包含指向 MyDialog 类的指针时,该指针不能包含 Ui:: 限定符:
private:
Ui::MainWindow *ui;
MyDialog *mDialog;
为什么?
有趣的问题,我以前没有注意到这个事实,也许是因为通常更喜欢通过代码构建 Ui 对象。
无论如何,该结构用于避免生成"服务"类名:例如,从我的实际 .h 开始
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
...
private:
Ui::Dialog *ui;
}
请注意Ui::Dialog *ui;
:这是由 top 声明(命名空间 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
命名空间是为了保护您的代码免受类的别名,如果您将类包装在命名空间中,则只能通过使用该命名空间来访问它,因此"类 t"与"命名空间::类 t"不同
相关文章:
- 在命名空间 c++ 中正确声明 extern 变量
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- 转发声明在命名空间中不起作用的替代方法
- C++ 17 个友元函数声明和内联命名空间
- 为什么 gcc 无法从其前向声明中检测到友元类命名空间?
- 声明"使用命名空间 C;"对于证明 [namespace.udir]/3 中的示例中显示的结果至关重
- 命名空间内C++变量声明
- 在命名空间中声明变量
- C++ 没有在命名空间外部声明的类主体的类
- 如何在命名空间中声明外部全局,然后定义它?
- 在 c++ 中在运行时声明对命名空间的引用
- 有没有办法转发声明命名空间或只是提前使其可见
- 如何在不同的命名空间中使用双重声明的 extern "C"函数进行 clang 构建(如 msvc 和 gcc)
- 为什么我应该使用extern关键字来声明命名空间范围中的变量
- 如何正确声明命名空间函数
- 如何转发声明命名空间中的类
- 在目标 C 中向前声明命名空间的C++类
- 在命名空间中的另一个函数内部正向声明命名空间中的一个函数
- 是否可以转发声明命名空间内的 typedef
- "using"命名空间和声明命名空间有什么区别?