本文說明 MFC 3.0 版和更新版本中的類型安全範本型集合類別。 使用這些範本來建立型別安全集合會比使用不是以範本為基礎的集合類別更有效率地提供類型安全性。
MFC 預先定義範本型集合的兩個類別:
-
CArray、CList、CMap 具類型指針的陣列、列表和映射
CTypedPtrArray、CTypedPtrList、CTypedPtrMap
簡單集合類別全部衍生自 類別 CObject,因此會繼承的串行化、動態建立和其他 屬性 CObject。 具類型的指標集合類別需要您指定衍生自的類別,這必須是 MFC 預先定義的其中一個非範本指標集合,例如 CPtrList 或 CPtrArray。 新的集合類別繼承自指定的基類,而新類別的成員函式會使用封裝呼叫基類成員來強制執行型別安全性。
如需C++範本的詳細資訊,請參閱 C++ 語言參考中的範本。
使用簡單陣列、清單和映射範本
若要使用簡單的集合範本,您必須知道您可以在這些集合中儲存的數據種類,以及集合宣告中要使用的參數。
簡單陣列和清單使用方式
簡單陣列和清單類別 CArray 和 CList 採用兩個參數: TYPE 和 ARG_TYPE。 這些類別可以儲存您在 TYPE 參數中指定的任何資料類型:
基本C++數據類型,例如
int、char和floatC++結構和類別
您定義的其他類型
為了方便和效率,您可以使用 ARG_TYPE 參數來指定函式自變數的類型。 一般而言,您會將 ARG_TYPE 指定為您在 TYPE 參數中命名的類型參考。 例如:
CArray<int, int> myArray;
CList<CPerson, CPerson &> myList;
第一個範例會宣告陣列集合 myArray,其中包含 **int**s。 第二個範例會宣告儲存物件的清單集合myListCPerson。 集合類別的某些成員函式會採用類型是由 範本 參數ARG_TYPE所指定的自變數。 例如,類別AddCArray的成員函式會採用ARG_TYPE自變數:
CArray<CPerson, CPerson &> personArr;
CPerson person;
personArr.Add(person);
簡單地圖使用方式
簡單對應類別 CMap 採用四個參數: KEY、 ARG_KEY、 VALUE 和 ARG_VALUE。 如同陣列和清單類別,映射類別可以儲存任何資料型別。 與陣列和清單不同的是,陣列和清單會為儲存的數據編制索引並排序,而映射則是鍵值對組合:您可以通過指定相關的索引鍵,存取映射中存儲的值。 KEY 參數會指定用來存取地圖中所儲存數據的索引鍵數據類型。 如果 KEY 的類型是結構或類別, ARG_KEY 參數通常是 KEY 中指定的型別參考。 VALUE 參數會指定儲存在地圖中的項目類型。 如果 ARG_VALUE 的類型是結構或類別, ARG_VALUE 參數通常是 VALUE 中指定的型別參考。 例如:
CMap<int, int, MY_STRUCT, MY_STRUCT &> myMap1;
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap2;
第一個範例儲存MY_STRUCT的值,透過int索引鍵存取這些值,並以參考方式傳回已存取的MY_STRUCT項目。 第二個範例會儲存CPerson值,並透過CString索引鍵存取這些值,然後傳回存取項目的參考。 此範例可能代表簡單的通訊簿,您可以在其中依姓氏查閱人員。
由於 KEY 參數的類型為 CString,且 KEY_TYPE 參數的類型為 LPCSTR,因此索引鍵會儲存在映射中作為CString類型的專案,但會在像是SetAt函式中透過LPCSTR類型的指標進行參考。 例如:
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);
使用 Typed-Pointer 集合範本
若要使用具類型的指標集合範本,您必須知道您可以儲存在這些集合中的數據種類,以及集合宣告中要使用的參數。
Typed-Pointer 陣列和清單使用方式
具類型的指標陣列和清單類別 CTypedPtrArray 和 CTypedPtrList 會採用兩個參數: BASE_CLASS 和 TYPE。 這些類別可以儲存您在 TYPE 參數中指定的任何資料類型。 它們衍生自其中一個儲存指標的非範本集合類別;您可以在 BASE_CLASS 中指定這個基類。 針對陣列,請使用 CObArray 或 CPtrArray。 針對清單,請使用 CObList 或 CPtrList。
實際上,當您根據 假設 CObList宣告集合時,新類別不僅會繼承其基類的成員,也會宣告一些額外的型別安全成員函式和運算符,藉由封裝基類成員的呼叫來提供型別安全性。 這些封裝會管理所有必要的類型轉換。 例如:
CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;
第一個範例會宣告一個具型別的指標陣列myArray,並由CObArray衍生而來。 陣列會儲存並傳回物件的指標 CPerson (其中 CPerson 是衍生自 CObject的類別)。 您可以呼叫任何 CObArray 成員函式,或是呼叫新的型別安全 GetAt 函式和 ElementAt 函式,或使用型別安全 [ ] 運算符。
第二個範例會宣告一個具型別指標清單myList,該清單是從CPtrList衍生而來。 清單會儲存 MY_STRUCT 物件的指標並傳回。 根據 CPtrList 的類別可用來儲存指向非衍生自 CObject 的物件的指標。
CTypedPtrList 具有數個類型安全的成員函式:GetHead、GetTail、RemoveHead、RemoveTail、GetNext、GetPrev 和 GetAt。
Typed-Pointer 地圖使用
具類型的指標映射類別 CTypedPtrMap 需要三個參數:BASE_CLASS、KEY 和 VALUE。
BASE_CLASS參數會指定要從中衍生新類別的類別:CMapPtrToWord、CMapPtrToPtr、CMapStringToPtr、、 CMapWordToPtrCMapStringToOb等。
KEY 類似於 中的 CMap:它會指定用於查閱的索引鍵類型。
VALUE 類似於 中的 CMap:它會指定儲存在地圖中的物件類型。 例如:
CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;
第一個範例是基於 CMapPtrToPtr 的地圖,它會使用 CString 鍵映射到指向 MY_STRUCT 的指標。 您可以藉由呼叫型別安全 Lookup 成員函式來查閱儲存的指標。 您可以使用 [ ] 運算符來查閱儲存的指標,並在找不到時新增它。 您可以使用型別安全的 GetNextAssoc 函式來迭代地圖。 您也可以呼叫 類別 CMapPtrToPtr的其他成員函式。
第二個範例是一個以CMapStringToOb為基礎的地圖,它使用字串索引鍵對應到CMyObject對象的預存指標。 您可以使用上一段所述的相同型別安全成員,也可以呼叫 類別 CMapStringToOb的成員。
備註
如果您為 class 參數指定 struct 或 型別,而不是型別的指標或引用,則該類別或結構必須具有複製構造函數。
如需詳細資訊,請參閱 如何建立 Type-Safe 集合。