基於DirectUI 的SCW- C++私有類實現要點及心得框架
2015.03函數
在設計 SCW 的過程當中。不斷了解新知識,做爲一個C++初學者,新的知識尤如甘露。尤爲在學習過程當中,看到別人好的經驗與方法,就像發現了新大陸同樣。SCW框架雖然還在構建中,還沒到 DirectUI那一步,但學習與開發的過程,充滿驚喜。工具
這兩天在重構SCW,這已是第三稿了。雖然個人基礎淺薄,知識不深,但我懂得一個道理。若是想弄個好點的SCW界面開發工具出來。沒有好的框架,後面實現所謂的DirectUI 都是虛的。要想作個理想一點的框架,就得學好基礎知識。學習
所以,這幾天,我從新去回個頭來看看C++類結構方面的知識,仔細,認真理解C++對內存與指針的管理。你網上漫遊中,終於找到了一些好的知識點。其中C++類中經過私有類來實現類的兼容與擴展,提升類的框架適應度,封裝類的思路的經驗。就是好的收穫。開發工具
私有類的實現,在QT中被廣泛使用。QT 中的 Q_D, Q_Q, 就是對私有類的引用接口。經過二天的瞭解與實操,如今將私有類的一些認識總結出來。測試
在第一次接觸到這個概念時,我一樣也有如下幾下疑問:優化
1. 什麼是私有類的實現?spa
2. 如何來實現?.net
3. 私有類有什麼必要性?爲何要引用私有類這種概念或方法設計
4. 有什麼弊端?
經過學習,加上本身動手實踐,以上的問題,被我一一解決或理解。並且,也決定,在作 DirectUI 的SCW界面框架時,用上這個好方法。
1.先說說什麼是私有類的實現
簡言之,就是在一個類ClassA中,經過私有的另外一個類ClassB,來實現大部分的功能。而且ClassB只爲 ClassA服務,也就是說,其餘的類,是不能直接訪問 ClassB的,這就是 ClassA的私有類。
初看起來,好像沒有必要,由於設計一個類,就是想達到某一任務或目的。直接用這個類來完成就好了。爲何還要經過另一個類來實現呢?這就引出了第二個問題,用私有類有什麼好處?
咱們須要展開來講說私有類的實現,才能更好地理解這種實現的好處:
ClassA 引用私有類ClassB, 不是簡單地想經過 ClassB 來實現其功能而已。若是僅是這樣,真沒有必要。直接用ClassA不更好?事件不是這樣簡單。ClassA 之因此使用私有類,有結構上的優點與必要。先來看看他的實現:
歸納總結一下私有類的實現重點:
在主類.h頭文件中聲明主類主體結構。同時聲明主類須要引用到的私有類的友元關係(即 friend class classB)並聲明一個訪問私有類的成員變量 classB b 或接口;
2. 不須要在主類.h頭文件中include包含私有類頭文件。也不要在工程任何一個.h頭文件中include包含私有類的.h頭文件。這是重點。
在主類的實現源文件(.cpp)中包含主類.h頭文件和私有類.h頭文件。同時在源文件中實現主類與私有類的功能。(也能夠分別用幾個.cpp來分別實現主類和私有類,代碼寫在哪都不不影響。)
舉例實現以下:
文件class_a.h
class ClassA { protected: friend class classB; // 聲明友元關係 public: classB b; // 私有類訪問入口 void func() …… }
再在另外一個頭文件class_b.h 中聲明 classB.的類的結構主體。(具體就不書寫了)
重點來了,在實現 classA的代碼文件classA.cpp中。同時包含 class_a.h, class_b.h.
這樣,classB 類以及classB.h文件就實現了私有性,class_b.h文件只在 classA.cpp文件中被引用。在工程中的其餘任何地方,都不須要引用class_b.h頭文件。
這個時候,能夠設想一下,任意修改 classB類的結構即修改class_b.h頭文件,都不會對工程中的其餘模塊有影響。甚至也不會影響 class_a.h文件。
至於哪些功能放在 classA 來實現,哪些功能要 classB來實現,這就是本身我的的設計思路與安排了。你甚至完成不須要 classA來實現任何具體內容,僅做爲一個接口性的類也行。
再舉個小例子:
classA 想實現 x, y 值的讀取與寫入。classA 只需這樣來實現.
class classA { int X(int value = 0, boo IsWirte = false) { if (IsWrite) // 寫入標誌 b->x = value; // 假設 b 是 classA的私有類對象 return b->x; }; // y 的實現同上 }
A簡化了要聲明成員變量x,一個函數就解決了讀寫。固然,這只是一個簡單示例,更多的實現須要我的去挖掘。
若是看到這,你能想到了點些什麼,說明你開始理解私有類的必要性了。
爲何要使用這樣的結構?這正是私有類存在的核心。也正是私有類的好處好處與必要性所在。
2.使用私有類的好處。
通上上面的簡單的說明,咱們能夠初步發現,私有類的幾個好處。
能夠簡化主類的結構。
能夠封裝主類的功能。
主類功能的擴展在私有類中實現,不會影響主類的頭文件結構。好比聲明中間變量,添加一些中間處理函數等。
大大提高了主類的兼容性與擴展性。
能夠達到隱藏設計思路的目的(這個僅做參考)
用以上小例子來講明一下:
類 ClassA, 咱們須要再添加一個功能,在設置 X的值時,須要檢測一下X的大小,而且限定在 >0而且 <N。固然,咱們能夠直接在 classA的結構中添加一個常量N,並修改 X()函數代碼達到目的 。可是,這樣 classA.h 的結構被改動,頭文件會被從新編譯,工程中引用到classA的其餘文件也會被從新編譯,若是這個classA是深底層性的基類,並且你的工程很大,文件不少的話,可想而知。
若是咱們僅是修改 classB的頭文件,和.cpp代碼文件,這種狀況就不會發生。雖然都是一樣的目的,一樣的修改,可是產生的結果大不同。
實際狀況會更復雜。咱們只是用一個簡單例子來引伸一下。實際應用中,咱們可能會爲完成一些新的任務,須要添加新的變量和處理函數。可是,若是這些添加都是在 classB中完成,classA的結構一點都不須要動。這樣保證了classA的兼容性,同時也達到了擴展 classA的功能的目的。同時減小了對頭文件的依賴。
具體應用場景本身去設想一下。若是 classA 須要在更新中不斷添加新功能,新變量。你甚至不須要改動 classA的任何結構,而只是 直接調用 classA 的私有成員來實現(固然,不建議這樣實現)。例如 A.PrivateObject()->newfunc(). 或 A.PrivateObject()->Width = 100; 諸如此類的實現可能。
若是 classA 是對外發布的 dll文件中的公共引用類,classA每一次結構的修改,都會對被 dll版本的更新帶來不兼容的可能性。設計科學的私有類,能夠達到優化程序或庫文件的二進制代碼的兼容性。
3. 弊端。
相對於優勢來講,使用私有類的弊端,能夠說一點都不是個事。
代碼量增多。由於功能實現了轉接,需在在主類添加一些轉接性的代碼,同時也增長了工做量。
代碼再也不清晰明。之前直接處理的功能再也不直接。對後來的開發者來講,須要花更多的時間去熟悉瞭解。
尤爲在修復BUG時,由於再也不直接明瞭的流程,須要從新回塑設計思路。
若是設計不當,私有類反而會帶來麻煩。讓程序結構顯得混亂。
4. 要點:
合理使用類的私有類實現方法。能夠達到以上說的好處。
只對重要的類才進行私有類的設計。不要什麼類都實現私有類。
要有一套統一的實現方法,好比設計一些方便的宏,規範統一的轉接口標準等。
要想更好地理解私有類,建議去深刻QT中類的實現。並本身動手設計案例來完成一些測試。
之前在剛學習類的概念時,我就認爲,類已是一種很好的封裝與兼容了。
可是,咱們在設計好一個類以後,會由於知識的積累或需求的增長,也可能由於客戶的需求或功能的豐富,常常性地去完善一個類。在沒有私有類這個概念的時候,咱們通常都是直接在類的原始結構上添加新成員變量或成員函數來完成這些修改。若是引用私有類的概念,主類的原始結構就不須要過多的修改甚至不做任何修改。類的封裝與兼容獲得了進一步的昇華!
我已經在個人 SCW 界面庫中採用了私有類。並測試完善了私有類的應用。
SCW 的我的想法,請參閱: 基於DirectUI的SC設計規劃的我的構想與目標
SCW 的DirectUI界面設計交流,請加 QQ羣: 177312461 或我的QQ: 48018276