Qt中的Q_D宏和d指針
阿新 • • 發佈:2018-07-09
erp 指針 pan get pri cas 變量 pre urn
Q_D的設置意在方便地獲取私有類指針,文件為qglobal.h。
1 #define Q_D(Class) Class##Private * const d = d_func()
d_func()函數如下實現:
1 #define Q_DECLARE_PRIVATE(Class) 2 inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } 3 inline const Class##Private* d_func() const{ return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } 4 friend class Class##Private;
這裏的d_func()雖然在宏裏面,但是如果代入具體的類型,這裏面就變成了以Class##Private的私有類指針為返回值,以func為函數名的函數。這裏的qGetPtrHelper是
1 template <typename T> static inline T *qGetPtrHelper(T *ptr) { return ptr; }
這個模板函數裏面裏的T要套入Class##Private這個具體的類。上面的那個Q_DECLARE_PRIVATE裏面的就成了這個模板類的一個聲明。
在QObject類裏面存在一個成員變量,d_ptr指針,定義如下:
1 QScopedPointer<QObjectData> d_ptr;
Qt中的Q_D宏和d指針