自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解 Qt PIMPL模式

移動(dòng)開發(fā)
本文介紹的是詳解 Qt PIMPL模式,這本文中,有接觸到了類,我們又溫習(xí)了一下,先來看內(nèi)容。

詳解 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模式還是很適用的。

 

  1. //public.h      
  2. Class PrivateClass //前置聲明      
  3. Class PublicA:     
  4. {     
  5. Public:     
  6.    PublicA(); //如果私有實(shí)現(xiàn)類要調(diào)用位于公共類中的方法,則將該公共類指針傳給私有類構(gòu)造函數(shù)       
  7.    ~PublicA();     
  8. Private:     
  9.     PrivateClass* iPoint;  //含有私有實(shí)現(xiàn)類的一個(gè)指針      
  10. Private:     
  11.     Friend class   PrivateClass;  //如果私有實(shí)現(xiàn)類要調(diào)用公開類的方法,則將之聲明為友類。      
  12. }     
  13.  
  14. //public.cpp      
  15. #include "public.h"      
  16. #ifdef Q_OS_SYMBIAN      
  17. #include "PrivateClass_symbian.h"      
  18. #else      
  19. #include "PrivateClass_win32.h"      
  20. #endif      
  21. PublicA::PublicA()     
  22. {      
  23.     #ifdef Q_OS_SYMBIAN                iPoint = PrivateClass::NewL(this);      
  24.     #else          
  25. iPointnew  PrivateClass( this );     
  26.     #endif      
  27. }    

如上: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ì)你有所幫助!

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-06-28 15:18:45

Qt 單例模式

2024-02-01 00:10:21

C++PIMPL編程

2011-06-24 10:05:51

QT 對(duì)象 父對(duì)象

2011-06-20 17:33:58

Qt MeegoTouch Maemo

2011-06-23 14:05:32

Qt 事件機(jī)制

2011-06-24 14:34:17

Qt 小票 打印

2011-06-30 14:34:17

QT Tablewidge QTableWidg

2011-06-20 14:27:57

Qt Embedded

2011-06-14 11:48:38

Webkit QT

2011-04-02 09:17:38

2011-06-17 10:19:11

Qt QWidge QSetting

2011-06-24 10:54:34

Qt Mysql

2011-06-17 09:58:26

Qt Chapter QObject

2011-07-04 16:12:00

QT QWidget

2011-06-24 12:58:49

Qt LineEdit

2011-07-04 17:18:23

Qt SQLite 數(shù)據(jù)庫

2011-06-24 15:30:22

QT 皮膚 QSS

2011-06-28 16:18:24

Qt QObject

2011-06-09 14:52:09

Pimpl機(jī)制

2011-06-30 09:46:01

QT 顯示視頻 linux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)