Qt D指標 私有指標實現

2021-09-26 00:24:18 字數 1951 閱讀 2309

相信不少剛開始閱讀qt源**的朋友在看到其中的private類和諸如q_d、q_q等巨集時都會思考,為什麼qt要用這樣乙個設計模式呢?這樣一段增加了不少複雜度的**,到底有多大的好處呢?簡單的說,這樣的好處在於保證**的二進位制相容性。

什麼是二進位制相容性?大名鼎鼎的kde專案是這樣介紹的:乙個庫是二進位制相容的,如果乙個程式和某個庫的某個版本動態鏈結,並且不需要重新編譯,即可在安裝有該庫較新版本的環境中執行。為什麼要保證二進位制相容性?如果不能保證庫的二進位制相容性,就意味著每次發布新版本時,依賴該庫的所有程式都必須重新編譯才能正常執行。顯然,這對於像qt這樣被廣泛採用的庫而言是完全不可接受的。關於二進位制相容性的更多資訊,感興趣的朋友可以參考下kde techbase上的這篇文章,這裡就不羅嗦了,僅僅和大家分享下具體的使用。

如果不使用d指標,那我們可能會有如下的乙個類宣告: 

class myclass

;

顯然,這裡的私有成員myvar是保證**二進位制相容性的大敵,所以我們需要使用d指標,改寫這個類:

class myclassprivate;

class myclass

;

這裡,我們定義了乙個指標d_ptr指向私有實現類,然後用q_declare_private巨集來定義一些輔助函式和宣告友元類:

#define q_declare_private(class) /

inline class##private* d_func() /

inline const class##private* d_func() const /

friend class class##private;

然後這個私有類的實現如下所示:

class myclassprivate

;

這裡的q_ptr指標就是指向公開的介面了,然後q_declare_public巨集則定義了輔助函式並宣告了友元類:

#define q_declare_public(class)                                    /

inline class* q_func() /

inline const class* q_func() const /

friend class class;

而我們還可以用q_d和q_q兩個巨集來進一步簡化訪問:

#define q_d(class) class##private * const d = d_func()

#define q_q(class) class * const q = q_func()

這就是qt中d指標/私有實現的最基本使用方法。最後用乙個比較完整的例子作為結尾:

// myclass.h

#ifndef myclass_h

#define myclass_h

#include class myclassprivate;

class myclass: public qobject

;#endif // myclass_h

// myclass.cpp

#include "myclass.h"

class myclassprivate

void foobar()

private:

myclass * const q_ptr;

q_declare_public(myclass);

};myclass::myclass(qobject *parent)

: qobject(parent)

, d_ptr(new myclassprivate(this))

myclass::~myclass()

void myclass::dummyfunc()

Qt d指標q指標

qt中的d指標和q指標,其實就是用pimpl手法來實現對介面細節的隱藏 不過它是用巨集做了一些處理 從而做到盡可能少的暴露標頭檔案給使用者,多個物件之間進行隱式共享,也能一定程度解決二進位制相容性問題。widget.h pragma once include include common.h cla...

指標,指標,指標。。。

1 指標常量與常量指標 int a 10 int const p1 a const int p2 a p1是不可改變位址的常量,即指標常量,但可以對它所指向的內容進行修改。p2是指向常量的指標,即常量指標,它所指向的位址內容是不可修改的,但其本身確實可以修改的。2 指標運算 includeint m...

指標,指標,指標。。。

1 指標常量與常量指標 int a 10 int const p1 a const int p2 a p1是不可改變位址的常量,即指標常量,但能夠對它所指向的內容進行改動。p2是指向常量的指標,即常量指標,它所指向的位址內容是不可改動的,但其本身確實能夠改動的。2 指標運算 includeint m...