基于模板的选件类
本文说明在 MFC 3.0 版的类型安全的基于模板的集合类和更高版本。 使用这些模板创建类型安全集合会更方便,并帮助比使用基于模板不的更有效地提供类型安全集合类。
MFC 预定义基于模板的集合两类:
简单数组,列表和映射类
CArray, CList, CMap
数组,列表,并映射类型化指针
CTypedPtrArray, CTypedPtrList, CTypedPtrMap
简单的集合类均从类 CObject派生,因此,它们继承序列化、动态创建和 CObject其他属性。 类型化指针集合类要求您指定从派生 —必须是 MFC 预定义的一个非指针集合,例如 CPtrList 或 CPtrArray的类。 将新集合类从指定的基类继承,因此,中封装的新类的成员函数使用对基类成员强制 " 类型安全。
有关 C++ 模板的更多信息,请参见《 C++ 语言的模板。
使用简单数组,列表和映射模板
若要使用简单的集合模板,则需要知道使用哪种数据在这些集合中存储,以及参数在集合说明。
简单数组和列表用法
该简单数组和列表类, CArray ,并 CList,采用两个参数: 类型 和 ARG_TYPE。 这些类可以存储任何数据类型,则可以在 类型 参数指定:
基本 C++ 数据类型,如 int、 char和 float
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;
第一个示例由 int 密钥存储 MY_STRUCT 值,访问它们,并返回捕获的 MY_STRUCT 项目引用。 第二个示例由 CString 密钥存储 CPerson 值,访问它们,并返回对捕获的项目。 此示例可能表示一个简单的通讯簿,则按姓查找人员。
由于 关键 参数是类型 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假设,新类不仅继承其基类的成员,但是,它也声明大量个附加的类型安全的成员函数,并可通过封装提供类型安全的运算符对基类成员。 这些封装管理所有必要的类型转换。 例如:
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。
键入指针映射用法
键入指针映射类, CTypedPtrMap,采用三个参数: BASE_CLASS、 键和 值。 BASE_CLASS 参数指定派生新类的类: CMapPtrToWord, CMapPtrToPtr, CMapStringToPtr, CMapWordToPtr, CMapStringToOb,依此类推。 键 是类似于 CMap项:它指定用于查找的键的类型。 值 类似于强调 CMap:它指定在映射中存储的对象的类型。 例如:
CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;
第一个示例是基于 CMapPtrToPt的映射 r " —它使用 CString 键映射到指针 MY_STRUCT。 可以通过调用一个类型安全的 Lookup 成员函数查找一个单元的指针。 可以使用 [] 运算符查找一个单元的指针和添加它,如果未找到。 使用类型安全的 GetNextAssoc 功能,并且可以重复映射。 还可以调用类 CMapPtrToPtr的其他成员函数。
第二个示例是基于 CMapStringToO的映射 b " —它使用字符串键映射到存储的指针 CMyObject 对象。 可以使用上一段中描述的相同类型安全的成员,或者可以调用类 CMapStringToOb的成员。
备注
如果对 值 参数指定 class 或 struct 类型,而不是指针或引用对于类型,类或结构必须具有复制构造函数。
有关更多信息,请参见 如何使类型安全集合。