詳解 Qt PIMPL模式
詳解 Qt PIMPL模式是本文將要介紹的內(nèi)容,不多說了,先來看內(nèi)容。進(jìn)行跨平臺(tái)的移植工作,這其中有些地方是無法完全移植過來的,所以:需要我們封裝一個(gè)接口類,在不同平臺(tái)下讓其有不同的實(shí)現(xiàn)。要做到這一點(diǎn):有很多辦法,條件編譯啊之類的。但是如果有這種方法,說白了:其還是兩份代碼,僅僅是放到同一個(gè)文件中。參考Qt實(shí)現(xiàn)跨平臺(tái)的辦法,正好讀了一片這方面的文章,發(fā)現(xiàn) PIMPL模式還是很適用的。
- //public.h
- Class PrivateClass //前置聲明
- Class PublicA:
- {
- Public:
- PublicA(); //如果私有實(shí)現(xiàn)類要調(diào)用位于公共類中的方法,則將該公共類指針傳給私有類構(gòu)造函數(shù)
- ~PublicA();
- Private:
- PrivateClass* iPoint; //含有私有實(shí)現(xiàn)類的一個(gè)指針
- Private:
- Friend class PrivateClass; //如果私有實(shí)現(xiàn)類要調(diào)用公開類的方法,則將之聲明為友類。
- }
- //public.cpp
- #include "public.h"
- #ifdef Q_OS_SYMBIAN
- #include "PrivateClass_symbian.h"
- #else
- #include "PrivateClass_win32.h"
- #endif
- PublicA::PublicA()
- {
- #ifdef Q_OS_SYMBIAN iPoint = PrivateClass::NewL(this);
- #else
- iPoint= new PrivateClass( this );
- #endif
- }
如上:PIMPL是設(shè)計(jì)了對(duì)外公共類和私有實(shí)現(xiàn)類。 亦即:多個(gè)平臺(tái)對(duì)外的接口都是***的這個(gè)對(duì)外公共類,而不同平臺(tái)都有自己的私有實(shí)現(xiàn)類 。
為了做到這一點(diǎn),需要如下做:
1、在頭文件中:
(1)聲明一下私有類(不是include)
(2)含有該私有類的一個(gè)指針數(shù)據(jù)成員。
2、在cpp實(shí)現(xiàn)文件中:
(1)用條件編譯的方式?jīng)Q定到底include哪個(gè)私有實(shí)現(xiàn)類的頭文件。
(2)在對(duì)外公共類的函數(shù)實(shí)現(xiàn)中:也用條件編譯的方法決定調(diào)用哪一個(gè)私有實(shí)現(xiàn)類的函數(shù)。
為了實(shí)現(xiàn)這一點(diǎn),要求:各個(gè)私有實(shí)現(xiàn)類的類名必須一樣?。ㄎ募梢圆灰恢拢?/p>
以上是一個(gè)最簡(jiǎn)單的模型,當(dāng)然:如果私有實(shí)現(xiàn)類中想調(diào)用對(duì)外公共類的函數(shù),則需要在公共類中做兩件事:
1、在其創(chuàng)建私有類時(shí):通過參數(shù)的方式將自己的指針傳入到私有類中,從而讓私有類含有公共類的指針。
2、在公共類中將私有類聲明為:友元類。 (這樣擴(kuò)大了私有類的訪問權(quán)限,這個(gè)可以依據(jù)實(shí)際情況來確定需要不需要)
事實(shí)上:這正是Qt用來對(duì)底層操作系統(tǒng)進(jìn)行抽象的解決辦法,它使開發(fā)者無需關(guān)心每一個(gè)平臺(tái)的底層編程方法和各種限制。
針對(duì)qt開發(fā)而言:一般這些私有實(shí)現(xiàn)類都是針對(duì)不同平臺(tái)的,比如:symbian的一些系同級(jí)的函數(shù),還有一些win特有的函數(shù),這些都是無法做到跨平臺(tái)的,我們可以用PIMPL模式來進(jìn)行抽象。此時(shí)上邊所說的條件編譯宏就是:不同平臺(tái)的宏了。同樣:還需要在pro中把針對(duì)不同平臺(tái)的私有實(shí)現(xiàn)文件放到平臺(tái)關(guān)鍵字中。
通常,如果公共類名為QMyClass ,那么:
私有類就被定義為QMyClassPrivate。
公共類的源文件和頭文件共享公共類名: qmyclass.h , qmyclass.cpp 。
私有類的頭文件和源文件名以 _p 結(jié)尾(比如 qmyclass_p.h ),除非該文件是一個(gè)平臺(tái)特定實(shí)現(xiàn)。
平臺(tái)特定實(shí)現(xiàn)的頭文件和源文件名中包括平臺(tái)名 – 如 qmyclass_symbian.cpp (不必在結(jié)尾處添加 _p ,因?yàn)橐呀?jīng)暗示)。
小結(jié):詳解 Qt PIMPL模式 的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!