樣板架構類別
本文說明 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
和float
C++ 結構和類別
您定義的其他類型
為了方便和效率,您可以使用 ARG_TYPE 參數來指定函式引數的類型。 一般而言,您會將ARG_TYPE 指定 為您在 TYPE 參數中 命名的類型參考。 例如:
CArray<int, int> myArray;
CList<CPerson, CPerson &> myList;
第一個範例會宣告陣列集合 myArray
,其中包含 ** int
**s。 第二個範例會宣告儲存物件的清單集合 myList
CPerson
。 集合類別的某些成員函式會採用其類型是由 ARG_TYPE 樣板參數所指定的引數。 例如,類別 Add
CArray
的成員函式會採用 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 參數的類型為 ,因此索引鍵會儲存在對應中做為 類型的 CString
LPCSTR
專案,但會透過 類型的 LPCSTR
指標等 SetAt
函式中參考。 例如:
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);
使用 Typed-Pointer 集合範本
若要使用具類型的指標集合範本,您必須知道您可以儲存在這些集合中的資料種類,以及集合宣告中要使用的參數。
具類型的指標陣列和清單使用方式
具類型的指標陣列和清單類別 CTypedPtrArray 和 CTypedPtrList 會採用兩個參數: BASE_CLASS 和 TYPE 。 這些類別可以儲存您在 TYPE 參數中指定的 任何資料類型。 它們衍生自其中一個儲存指標的非樣板集合類別;您會在 BASE_CLASS 中 指定這個基類。 針對陣列,請使用 CObArray
或 CPtrArray
。 針對清單,請使用 CObList
或 CPtrList
。
實際上,當您根據 假設 CObList
宣告集合時,新類別不僅會繼承其基類的成員,也會宣告一些額外的型別安全成員函式和運算子,藉由封裝基類成員的呼叫來提供型別安全性。 這些封裝會管理所有必要的類型轉換。 例如:
CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;
第一個範例會宣告衍生自 CObArray
的具型別指標陣列 myArray
。 陣列會儲存並傳回物件的指標 CPerson
(其中 CPerson
是衍生自 CObject
的類別)。 您可以呼叫任何 CObArray
成員函式,或是呼叫新的型別安全 GetAt
函式和 ElementAt
函式,或使用型別安全 [ ] 運算子。
第二個範例會宣告衍生自 CPtrList
的具型別指標清單 myList
。 清單會儲存並傳回物件的指標 MY_STRUCT
。 根據 CPtrList
的類別可用來儲存不是衍生自 CObject
的物件指標。 CTypedPtrList
具有數個型別安全成員函式:、、、、 RemoveTail
、 GetNext
、 GetPrev
、 和 GetAt
。 RemoveHead
GetTail
GetHead
具類型的指標對應使用方式
具類型的指標對應類別 CTypedPtrMap 採用三個參數: BASE_CLASS 、 KEY 和 VALUE 。 BASE_CLASS 參數會指定要從中衍生新類別的類別: CMapPtrToWord
、 CMapPtrToPtr
、 CMapStringToPtr
、、 CMapWordToPtr
、 CMapStringToOb
等等。 KEY 類似于 中的 CMap
KEY :它會指定用於查閱的索引鍵類型。 VALUE 類似于 中的 CMap
VALUE :它會指定儲存在地圖中的物件類型。 例如:
CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;
第一個範例是以 對應為基礎 CMapPtrToPtr
,它會使用 CString
對應至 指標的 MY_STRUCT
索引鍵。 您可以藉由呼叫型別安全 Lookup
成員函式來查閱儲存的指標。 您可以使用 [ ] 運算子來查閱儲存的指標,並在找不到時新增它。 您可以使用型別安全 GetNextAssoc
函式來反覆運算對應。 您也可以呼叫 類別 CMapPtrToPtr
的其他成員函式。
第二個範例是以 對應為基礎 CMapStringToOb
,它會使用對應至物件預存指標的 CMyObject
字串索引鍵。 您可以使用上一段所述的相同型別安全成員,也可以呼叫 類別 CMapStringToOb
的成員。
注意
如果您指定 class
VALUE 參數的 或 struct
型別,而不是型別的 指標或參考,類別或結構必須有複製建構函式。
如需詳細資訊,請參閱 如何建立類型保管庫集合 。