Q_D指针在QT源码中大量的使用,其根本目的在于解决二进制兼容问题。
何为二进制兼容?
1.动态链接到库的前一个版本的程序继续与库的新版本一起运行而不需要重新编译,则库是二进制兼容的。
2.程序需要重新编译以使用新版本的库运行,但不需要任何进一步的修改,则该库是源代码兼容的。
让所有的共有类都拥有一个指针,这个指针包含所有数据的私有数据结构。
这个指针就是称为d指针的Q_D指针。
起源:
基类
/* DObject 基类 */
/*** DObject.h ***/
class DObjectPrivate;
class DObject{
public:
DObject();
~DObject();
protected:
DObjectPrivate* d_ptr_;
friend class DObjectPrivate;
};
/*** DObject.cpp ***/
#include "DObject.h"
#include "DObject_p.h"
DObject::DObject():
d_ptr_(new DObjectPrivate(this)){
}
DObject::~DObject() {
if (!!d_ptr_){
delete d_ptr_;
d_ptr_ = nullptr;
}
}
/* DObjectPrivate 基类 */
/*** DObjectPrivate.h ***/
class DObject;
class DObjectPrivate{
public:
DObjectPrivate(DObject* q_ptr);
~DObjectPrivate();
protected:
DObject* q_ptr_;
};
/*** DObjectPrivate.cpp ***/
DObjectPrivate::DObj