如何:建立類型安全集合
本文說明如何進行資料型別的型別安全集合。 主題包括:
請改用型別安全的樣板類別
實作協助函式
使用非樣板集合類別
MFC 程式庫提供以 C++ 樣板的預先定義型別安全集合。 因為他們是範例所以這些類別可提供在用於這個非樣板類別和易用性,不是模型模擬和其他額外的工作相關的型別安全。 MFC 收集 範例示範在 MFC 應用程式樣板架構集合類別。 一般而言,請使用這些類別撰寫新的設定程式碼時。
請改用型別安全的範本類別
若要使用範本類別
宣告集合中的型別變數。 例如:
CList<int, int> m_intList;
呼叫集合物件的成員函式。 例如:
m_intList.AddTail(100); m_intList.RemoveAll();
如果需要,請實作 Helper 函式 和 SerializeElements。 如需實作這些函式的詳細資訊,請參閱 實作 Helper 函式。
這個範例顯示整數清單的宣告。 在步驟 1 中的第一個參數是做為清單項目中儲存的資料型別。 第二個參數的資料如何傳遞至和從集合類別的成員函式所傳回,例如 Add 和 GetAt。
實作協助函式
範本架構集合將 CArray、 CList和您可以自訂如需要針對衍生集合類別的 CMap 使用五個全域 Helper 函式。 如需這些 Helper 函式的詳細資訊,請參閱《 MFC 參考》中的集合類別 Helper 。 序列化函式的實作需要的對樣板架構集合類別的大部分使用。
序列化項目
CArray、 CList和 CMap 類別從封存呼叫 SerializeElements 儲存至集合項目或讀取它們。
SerializeElements 協助程式函式的預設實作會在物件上執行位元寫入封存,或者位元從封存讀取到物件,取決於是否儲存物件或從封存中擷取。 如果動作不是適當的,覆寫 SerializeElements 。
如果您的集合來儲存衍生自 CObject 的物件,而且想要在集合項目類別的實作使用 IMPLEMENT_SERIAL 巨集,您可以利用序列化功能內建在 CArchive 和 CObject:
CArray< CPerson, CPerson& > personArray;
template <> void AFXAPI SerializeElements <CPerson> (CArchive& ar,
CPerson* pNewPersons, INT_PTR nCount)
{
for (int i = 0; i < nCount; i++, pNewPersons++)
{
// Serialize each CPerson object
pNewPersons->Serialize(ar);
}
}
CArchive 的插入運算子呼叫 CObject::Serialize (或該函式覆寫) 每個 CPerson 物件的。
使用非樣板集合類別
MFC 也支援集合類別簡介使用 MFC 1.0 版。 這些類別不是以 MFC ODBC 類別為基礎。 它們可以用來包含支援的型別、 UINTCObject*、 DWORD和 CString資料。 您可以使用這些預先定義的集合 (例如 CObList) 保留從 CObject衍生的物件集合。 MFC 也提供預先定義的集合有基本型別 (例如 UINT 和 null 指標 (void*)。 不過,一般而言,定義自己的型別安全集合含有特定的類別和它的衍生的物件通常會很有幫助。 請注意使用樣板類別,這樣做會根據範本中的集合類別是比更多工作。
有兩種方式建立非樣板集合的型別安全集合:
在必要時使用有型別轉換的非範本集合。 這是最簡單的辦法。
衍生自並擴充非樣板型別安全集合。
用於型別轉換的非樣板集合
直接使用其中一個非範本類別,例如 CWordArray。
例如,您可以建立 CWordArray 並加入任何 32 位元值給它,然後擷取它們。 沒有任何項目。 您可以使用預先定義的功能。
您也可以使用預先定義的集合,例如 CObList,其包含所有衍生自 CObject的物件。 CObList 集合定義存放指標到 CObject。 當您從清單中擷取物件,您可能必須將結果轉換為適當的型別,因為 CObList 函式傳回 CObject的指標。 例如,在中,如果您在 CObList 集合中 CPerson 物件,您必須轉型為已擷取的項目是指標到 CPerson 物件。 下列範例會使用 CObList 集合中保留 CPerson 物件:
CPerson* p1 = new CPerson(); CObList myList; myList.AddHead(p1); // No cast needed CPerson* p2 = (CPerson*)myList.GetHead();
這個技術視需要使用預先定義的集合型別和轉型可能已滿為您的許多集合需要。 如果您需要進一步功能或多個型別安全,請使用樣板類別或依照下一個程序。
衍生並擴充非範本型別安全集合。
從其中一個預先定義非範本類別衍生您自己的集合類別。
當您衍生您的類別時,您可以將型別安全包裝函式提供型別安全的介面給現有的函式。
例如,如果您,衍生自 CObList 的清單中保留 CPerson 物件,您可以將包裝函式 ( AddHeadPerson 和 GetHeadPerson,如下所示。
class CPersonList : public CObList { public: void AddHeadPerson( CPerson* person ) {AddHead( person );} const CPerson* GetHeadPerson() {return (CPerson*)GetHead();} };
這些包裝函式提供型別安全方式從這個衍生的清單中加入和擷取 CPerson 物件。 您可以為 GetHeadPerson 函式,您封裝型別轉型。
您可以定義擴充功能集合而非包裝在型別安全包裝函式的現有功能的新函式也可以加入新的功能。 例如, 刪除在 CObject 集合的所有物件。 文章說明一個函式會刪除清單中的所有物件。 這個函式可以加入到衍生類別做為成員函式。