樣板式類別
本文件說明 MFC 3.0 版和之後的版本中的型別安全的樣板式集合類別。 使用這些範本來建立型別安全集合,會比較方便,有助於提供比使用非樣板式集合類別更有效率地型別安全。
MFC 預先定義了兩種樣板式集合類別:
簡單的陣列、 清單及對應的類別
CArray, CList, CMap
陣列、 清單和對應的型別指標
CTypedPtrArray, CTypedPtrList, CTypedPtrMap
簡單的集合類別衍生自類別CObject,所以他們繼承序列化、 動態建立及其他屬性的CObject。 型別的指標的集合類別會要求您指定您可以從衍生的類別,它必須是一組預先定義的 MFC 中,例如非樣板指標集合CPtrList或CPtrArray。 新的集合類別繼承自指定的基底類別,並新的類別成員函式會使用封裝的呼叫基底類別成員可以執行型別安全。
如需有關 C++ 樣板的詳細資訊,請參閱範本 在 C + + 語言參考。
使用簡單的陣列、 清單及對應的範本
若要使用簡單式集合樣板,您需要知道這些集合中可以儲存何種資料,以及在集合宣告中使用何種參數。
簡單式陣列和串列的用法
簡單式陣列和串列類別, CArray 和 CList,採用兩個參數: 型別和ARG_TYPE。 這些類別可以儲存任何資料型別,您可以指定在型別參數:
基本的 C++ 資料類型,例如int, char,以及浮點數
C + + 結構和類別
您定義其他型別
為了方便及效率,您可以使用ARG_TYPE參數來指定函式引數的型別。 一般而言,您指定ARG_TYPE做為在中所命名的型別為參考型別參數。 例如:
CArray<int, int> myArray;
CList<CPerson, CPerson&> myList;
第一個範例會宣告陣列的集合中, myArray,其中包含ints。 第二個範例會宣告清單集合, myList,儲存CPerson物件。 集合類別的某些成員函式採用型別由所指定的引數ARG_TYPE樣板參數。 例如, 新增成員函式類別的CArray會使用ARG_TYPE引數:
CArray<CPerson, CPerson&> personArr;
CPerson person;
personArr.Add(person);
簡單對應的用法
建立的簡單地圖的類別中, CMap,採用四個參數: 機碼, ARG_KEY, 值,以及ARG_VALUE。 像陣列和串列類別中,對應類別可以儲存任何資料型別。 不像陣列和串列編製索引,和訂購其儲存的資料,為對應關聯索引鍵和值: 您可以存取儲存於對應的指定值的相關聯的索引鍵的值。 機碼參數會指定用來存取資料儲存在對應的索引鍵的資料型別。 如果型別機碼是結構或類別, ARG_KEY參數通常是在指定的型別參考機碼。 值參數會指定儲存在對應中的項目類型。 如果型別ARG_VALUE是結構或類別, ARG_VALUE參數通常是在指定的型別參考值。 例如:
CMap< int, int, MY_STRUCT, MY_STRUCT& > myMap1;
CMap< CString, LPCTSTR, CPerson, CPerson& > myMap2;
第一個範例儲存區MY_STRUCT值值,來進行存取int機碼和傳回存取MY_STRUCT所參考的項目。 第二個範例儲存區CPerson值值,存取他們的CString機碼,並傳回參考存取的項目。 這個範例可能代表簡單的通訊錄,在其中您查詢的人依姓氏。
因為機碼參數屬於型別CString和 KEY_TYPE 參數屬於型別LPCSTR,索引鍵依照在對應項目類型CString ,但如參考函式中SetAt透過型別的指標LPCSTR。 例如:
CMap< CString, LPCTSTR, CPerson, CPerson& > myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);
使用型別指標的集合樣板
若要使用的型別指標的集合樣板,您需要知道這些集合中可以儲存哪些資料類型,以及在集合宣告中使用何種參數。
型別指標陣列和串列的用法
型別指標陣列和串列類別, CTypedPtrArray 和 CTypedPtrList,採用兩個參數: BASE_CLASS和型別。 這些類別可以儲存任何資料型別,您可以指定在型別參數。 它們衍生自儲存指標 ; 非樣板集合類別的其中一個 您可以指定在自此基底類別BASE_CLASS。 若是陣列,使用任何一種CObArray或CPtrArray。 就清單而言,使用任何一種CObList或CPtrList。
實際上,當您宣告集合為基礎,說出CObList,新的類別不只會繼承其基底類別的成員,但它也宣告了一些額外的型別安全成員函式和運算子,可協助提供型別安全性封裝呼叫基底類別成員。 這些 encapsulations 來管理所有必要的型別轉換。 例如:
CTypedPtrArray<CObArray, CPerson*> myArray;
CTypedPtrList<CPtrList, MY_STRUCT*> myList;
第一個範例宣告一個型別指標陣列, myArray、 衍生從CObArray。 陣列會儲存,並傳回指向CPerson物件 (其中CPerson類別衍生自CObject)。 您可以呼叫任何CObArray成員函式,或者您可以呼叫新的型別安全GetAt和ElementAt的函式,或使用型別安全 運算子。
第二個範例會宣告型別指標的清單中, myList、 衍生從CPtrList。 清單會儲存,並傳回指向MY_STRUCT物件。 類別為基礎CPtrList用來儲存這並非衍生自物件的指標CObject。 CTypedPtrListhas a number of type-safe member functions: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrev, and GetAt.
型別指標對應的用法
型別指標對應的類別中, CTypedPtrMap,需要三個參數: BASE_CLASS, 機碼,以及值。 BASE_CLASS參數會指定要從中衍生新類別的類別: CMapPtrToWord, CMapPtrToPtr, CMapStringToPtr, CMapWordToPtr, CMapStringToOb,依此類推。 機碼就像機碼在CMap: 它會指定查閱時使用的索引鍵的型別。 值就像值在CMap: 它會指定儲存在對應的物件型別。 例如:
CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;
第一個範例是根據對應 CMapPtrToPtr — 它會使用CString機碼的指標來對應MY_STRUCT。 您可以藉由呼叫型別安全查閱已儲存的指標Lookup成員函式。 您可以使用 運算子來查閱 [已儲存的指標,並將它加入如果找不到。 您可重複使用型別安全的對應,並GetNextAssoc函式。 您也可以呼叫其他成員函式類別的CMapPtrToPtr。
第二個範例是根據對應 CMapStringToOb — 它會使用字串索引鍵對應至預存的指標CMyObject物件。 您可以使用相同的型別安全成員所述的前一個段落,或您可以呼叫類別的成員CMapStringToOb。
注意事項 |
---|
如果您指定類別或struct中輸入值參數,而不是指標或參考型別、 類別或結構必須要有複製建構函式。 |
如需詳細資訊,請參閱如何讓型別安全集合。