【轉】剖析ATL\WTL\CSTRING的實現

原文地址:http://www.cnblogs.com/tekkaman/archive/2011/04/20/2022570.html


話說CString這個東西困擾了很多年輕人,因爲它會引起詭異的編譯錯誤,今天跟着我一起來深入ATL、WTL頭文件,來把這個東西搞個清清楚楚。

涉及到頭文件

  ATL : atlstr.h, atlsimpstr.h

  MFC : cstringt.h、afxstr.h

  WTL : atlmisc.h

  ATL和MFC有關剪不斷理還亂的關係,爲了更容易分析,我們先要理清這四個頭文件間的關係。觀察相互間觀察順序,可以得出:

  atlstr.h引用cstringt.h,cstring引用atlsimpstr.h,afxstr.h引用cstringt.h,由此可得出下圖:

 

atlsimpstr.h 都幹了什麼

  1、定義了 CStringData 和 CNilStringData 類(前篇已述,此處略)

  2、定義了 ChTraitsBase 類,類如下:

     

  此類比較簡單,功能是爲不同的字符類型,建立新的統一的名稱。另外,這裏使用到了模板特化技術。

     3、定義了CSimpleStringT類,此類的功能是,在ChTraitBase定義的統一名稱的基礎上,提供字符串一些基本的操作功能函數。

  

      t_bMFCDLL可無視。另外,注意,此處所操作的字符串對象,都是CStringData(前篇已述)

  總述:在atlsimpstr.h中,我們發現了3個令人感興趣的東西,CStringData 是字符串操作單元,ChTraitBase提供字符串變量統一命名服務,而CSimpStringT是一個基於CStringData字符串操作單元的簡易的CString(注意,只是簡易,其中並未提供我們常用的CString中的那些函數)。

cstringt.h 都幹了什麼

  1、定義了 ChTraitsCRT 類,如下:

  

  該類繼承atlsimpstr.h中的 ChTraitsBase 類,然後在父類提供服務的基礎上,提供一系列字符串底層操作函數。思考:爲什麼此處用繼承?而CSimpleStringT使用提typedef?

  2、定義了 _MFCDLLTraitsCheck 類,如下:

  

   這裏再一次用到了模板特化技術,該類用於檢測當前使用的StringTraits是ATL定義的還是MFC定義的。(ATL定義的叫StrTraitATL,MFC定義的叫StrTraitMFC,後面會提到)

  3、定義了 CStringT 類,如下:

  

   注意了,CStringT 就是CString的真身!前面說到,CSimpStringT操作CStringData字符串操作單元,提供基本的字符串操作功能,而CStringT繼承CSimpleStringT,利用StringTraits,包裝更高級的功能函數。而這些更高級的功能函數,就是我們通常調用CString時所使用到的那些函數。

atlstr.h 都幹了什麼

  1、定義了 CAtlStringMgr 類。(前文已述)

  2、定義了 ChTraitsOS 類,如下:

  

  和 ChTraitCRT相對應,ChTraitsOS繼承atlsimpstr.h中的 ChTraitsBase 類,然後在父類提供服務的基礎上,提供一系列字符串底層操作函數。

      和 ChTraitCRT相比,他倆提供的函數大部相關,少數不同,另外相同函數名的實現不一定相同。

  3、定義了 StrTraitATL 類,如下:

  

  和 StrTraitMFC相對應,該類提供字符串資源管理函數和CStringData內存管理器的ATL版。

  4、定義了CSTRING,如下:

  

afxstr.h 都幹了什麼

  1、定義了 StrTraitMFC,如下:

  

  上文已述,和StrTraitATL相對,本類提供的功能實現都封閉在MFC中。

  2、定義了CString,如下:

  

atlmisc.h 都幹了什麼

  打開atlmisc.h,可以發現此文件只不過是定義了一些結構體,定義了一個CString的簡易版。因爲ATL CString依賴於MFC頭文件,所以,如果在使用CSTRING而又不想加入過多其它文件時,WTL CSTRING提供了一個很好的選擇。

  所有文件都分析後,我們發現,atl、mfc、wtl分別定義了一個CString。其中atl和mfc中的CString都是基於CStringT,只有一個地方是不同的,即CStringT所引用的StringTrait(即StrTraitsATL 還是 StrTraitMFC)。而WTL CString 的實現是獨立的,是一個真正的類。另外 ,StringTrait引用的Iterator是可選的(即底層字符串操作封裝)。

  最後,我們發現ATL和MFC中涉及CString的類關係有些複雜,我希望畫一個圖來更好的描述各個類間的相互關係,這個圖將放在下一篇隨筆……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章