Qt的D指针和Q指针,实际上就是一个类的成员指针变量,改变量指向另一个Private类对象,这个Private类对象中包含了一系列的成员和函数。
这样做的目的:1.可以对外隐藏数据内容。2. 防止改变类的数据模型,从而做到二进制兼容。
Q_DECLARE_PUBLIC提供一个q_func q_ptr Q_Q,一般是在XXXPrivate类中使用,需要自己声明 XXX* q_ptr
Q_DECLARE_PRIVATE提供一个d_func d_ptr Q_D,一般是在XXX类中使用,需要自己声明XXXPrivate* d_ptr
Q_DECLARE_PRIVATE_D同上,然后声明XXXPrivate* 任意名称;
D指针的具体实现宏
define Q_DECLARE_PRIVATE(Class) \
inline Class##Private* d_func() {return d_ptr;}
friend class Class##Private;
#define Q_DECLARE_PRIVATE_D(Dptr, Class) \
inline Class##Private* d_func(){return Dptr;} \
friend class Class##Private;
#define Q_DECLARE_PUBLIC(Class) \
inline Class* q_func() { return static_cast<Class *>(q_ptr); } \
inline const Class* q_func() const { return static_cast<const Class *>(q_ptr); } \
friend class Class;
#define Q_D(Class) Class##Private * const d = d_func()
#define Q_Q(Class) Class * const q = q_func()
d_ptr q_ptr
而Q指针,实际上就是在Private类中的指针,就是指向那个暴露给用户的类。