前置声明 = Forward Declaration
对于一个刚刚接触include写法的童鞋来说,
突然看到很多人用如下写法:不知甚解否?
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> //! [前置声明] QT_BEGIN_NAMESPACE class QPushButton; class QLabel; class QLineEdit; QT_END_NAMESPACE //! [前置声明] class Dialog:public QDialog { Q_OBJECT public: Dialog(); ~Dialog(); }; #endif // DIALOG_H
这里记录下自己对此的探究过程:
首先,在Qt自带的一些例子、内置类库,就可以看到这种写法:
同样的Qt其他例子程序以及其他内置类,你慢慢看都会找到类似的很多“前置声明”写法,
那么,重点来了:
前置声明到底是什么(what)?有什么用(why)?用在哪里(where)?
what:简单来说,
在Qt里就是如下的一种写法:
//! [前置声明] QT_BEGIN_NAMESPACE class QPushButton; //随便你 class QLabel; //还是随便你 class QLineEdit; //就是随便你 QT_END_NAMESPACE //! [前置声明]
why:通俗易懂点说,
- 可以避免多个include产生的文件依赖,提高编译速度;
- 可以避免重复indude导致的相互引用问题,提高容错;
- 以及其他...以后补充
- 其实在Qt有点不爽的是,用了前置声明,在new的会看不到自动补全的提示。
where:直接看Qt官方的使用,
Qt里中的控件类QPushButton、QLabel等等都是一定、肯定、保证定义好并且可以使用的,
那么我们就可以直接用前置声明来写,因为这些控件类不需要我们去操心,肯定能用。
而什么情况下不适合用呢?
比如自定义了一个类继承QDialog,那么QDialog最好用不要用前置声明,而建议用include。
再次声明:本篇完全是个人理解方式、错误难免,忘指正。
时间: 2024-10-08 09:22:14