MSDN 基於模板的集合類

2021-06-26 10:06:04 字數 3045 閱讀 8828

翻譯:

collections:template-based classes

這篇文章是介紹在mfc3.0及以後版本中的型別安全的、基於模板的集合類。使用這些模板去建立型別安全的集合與使用沒有基於模板的集合類相比更加方便而且提供了更好的型別安全。

mfc預先定義了兩類基於模板的集合

*簡單的陣列、列表、對映類

carray, clist, cmap

*指定型別的陣列、列表、對映指標

ctypedptrarray, ctypedptrlist,ctypedptrmap;

簡單的集合類都是從cobject派生下來的,因此它們繼承了cobjec的序列化、動態生成等屬性;型別指標集合類要求使用者指定繼承的基類——必須是乙個mfc預先指定的非模板集合類,例如cptrlist、cptrarray或coblist等。使用者的新型別集合類繼承自指定的基型別,而且新型別的函式使用封裝在基型別中的方法來確保型別安全。

要獲取更多關於c++模板的資訊,可以參看template topics主題

*簡單array、list、map模板的使用

使用簡單集合模板,使用者必須知道這些集合中能存什麼樣的資料,以及在宣告自己的集合時要指定什麼引數。

**簡單array和list的使用

簡單陣列、列表類:carray和clist,帶有兩個引數:type和arg_type;

集合類中儲存的資料型別是由type指定的,可以是c++內建型別、c++結構體或者類、使用者自定義型別;

為了更加便利和高效,可以使用arg_type引數來指定函式引數的型別,通常,指定arg_type為通過type指定的型別的引用型別。例如:

carraymyarray;

clistmylist;

第乙個例子宣告了乙個陣列集合類物件,myarray,其中包含int型資料;第二個例子宣告乙個列表集合類物件mylist,其中存放cperson物件;集合類的有些成員函式的引數是由arg_type模板引數指定的,例如carray的add成員函式帶有乙個arg_type引數:

carraymyarray;

cperson person;

myarray->add( person );

**簡單map的使用

簡單map類:cmap,攜帶四個引數:key,arg_key, value,和arg_value。類似於陣列和列表類,map類能夠儲存任意型別資料。不像陣列和列表通過順序索引它儲存的資料,map是通過關聯鍵和值的;是通過值所關聯的鍵來使用儲存在map中的值。引數key指定指定鍵的資料型別,如果key的型別是乙個結構體或者類,那麼arg_key引數通常是key的引用型別。引數value指定儲存在map中的資料的型別,如果value型別是乙個結構體或者類時,arg_value引數通常是value型別的引用。例如:

cmapmymap1;

cmapmymap2;

第乙個例子儲存my_struct值,通過int型的鍵訪問,而且通過引用型別返回訪問的my_struct資料項。第二個例子儲存cperson值,使用cstring鍵訪問,並且返回訪問物件的引用,這個例子可以實現乙個位址本。

由於引數key是乙個cstring型別,key_type引數是乙個lpcstr型別,儲存在map中的鍵型別是cstring型別,但是在像setat這些函式中引用是通過lpcstr型別指標的,例如:

cmap< cstring, lpcstr, cperson, cperson& > mymap2;

cperson person;

lpcstr lpstrname = 「jones」;

mymap2->setat( lpstrname, person);

*指定型別指標集合模板的使用

使用指定型別的指標集合模板,要知道這些集合中存放什麼樣的資料,宣告自己的集合時使用什麼樣的引數。

**指定型別指標的陣列和列表的使用

指定型別指標的陣列和列表類:ctypedptrarray和ctypedptrlist,攜帶兩個引數:base_class 和type。這些類可以儲存通過引數type指定的任意型別資料。它們是從乙個非模板集合類(儲存指標)繼承下來,通過base_class引數指定基型別,對陣列來說,使用cobarray或者cptrarray,對於列表來說,使用coblist或者cptrlist。

事實上,比如宣告乙個基於coblist的集合,新類不僅繼承了基類的成員,而且宣告了一些額外的型別安全的函式和操作符,它們的型別安全通過封裝呼叫基類的成員來提供;那麼這些封裝管理所有必要的型別轉換。

例如:ctypedptrarraymyarray;

ctypedptrarraymylist;

第乙個例子宣告乙個指定型別的指標陣列,myarray,繼承自cobarray,陣列儲存和返回指向cperson(cperson繼承自cobject)物件的指標,使用者可以呼叫任何cobarray的成員函式,也可以呼叫新的型別安全的getat和elementat函式或者使用型別安全的操作符。

第二個例子宣告了乙個指定型別的指標列表,mylist,繼承自cptrlist,列表中儲存my_struct型別指標,儲存不是從cobject繼承下來的類的指標,要指定基型別為cptrlist,ctypedptrlist有許多態別安全的成員函式:gethead、gettail、removehead、removetail、getnext、getprev、getat。

**指定型別的map的使用

ctypedptrmap,攜帶三個引數:base_class, key,value;

ctypedptrmapmyobjectmap;

第二個例子是乙個基於cmapstringtoob的map,它使用cstring key對映到cmyobject物件指標,可以像上面介紹一樣使用型別安全的成員函式,也可以呼叫cmapstringtoob類的成員函式。

注意:如果你為value引數指定乙個類型別或結構體型別,而不是該型別的指標或者引用,那麼這個類或者結構體必須要有乙個拷貝建構函式。

CArchive類 MSDN上的東西

mfc 提供carchive類實現資料的緩衝區讀寫,同時定義了類物件的儲存與讀取方案。建立 carchive 物件有兩種方法 最普通且最容易的方法是使框架代表 檔案 選單上的 儲存 另存為 和 開啟 命令為文件建立carchive物件。以下是應用程式的使用者從 檔案 選單上發出 另存為 命令時,框架...

Silverlight在MSDN類庫中的小變化

目前微軟對silverlight在msdn類庫的導航位置進行了調整,大家會發現silverlight被同時安排在.net development節點和web development節點下。微軟將silverlight的out of browser功能和windows phone 7開發單獨列出在.n...

Silverlight在MSDN類庫中的小變化

目前微軟對silverlight在msdn類庫的導航位置進行了調整,大家會發現silverlight被同時安排在.net development節點和web development節點下。微軟將silverlight的out of browser功能和windows phone 7開發單獨列出在.n...