基于模板的选件类

本文说明在 MFC 3.0 版的类型安全的基于模板的集合类和更高版本。 使用这些模板创建类型安全集合会更方便,并帮助比使用基于模板不的更有效地提供类型安全集合类。

MFC 预定义基于模板的集合两类:

  • 简单数组,列表和映射类

    CArray, CList, CMap

  • 数组,列表,并映射类型化指针

    CTypedPtrArray, CTypedPtrList, CTypedPtrMap

简单的集合类均从类 CObject派生,因此,它们继承序列化、动态创建和 CObject其他属性。 类型化指针集合类要求您指定从派生 —必须是 MFC 预定义的一个非指针集合,例如 CPtrListCPtrArray的类。 将新集合类从指定的基类继承,因此,中封装的新类的成员函数使用对基类成员强制 " 类型安全。

有关 C++ 模板的更多信息,请参见《 C++ 语言的模板

使用简单数组,列表和映射模板

若要使用简单的集合模板,则需要知道使用哪种数据在这些集合中存储,以及参数在集合说明。

f728cbk3.collapse_all(zh-cn,VS.110).gif简单数组和列表用法

该简单数组和列表类, 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);

f728cbk3.collapse_all(zh-cn,VS.110).gif简单的映射用法

简单的映射类, 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);

使用键入指针集合模板

若要使用键入指针集合模板,则需要知道使用哪种数据在这些集合中存储,以及参数在集合说明。

f728cbk3.collapse_all(zh-cn,VS.110).gif键入指针数组和列表用法

键入指针数组和列表类, CTypedPtrArray ,并 CTypedPtrList,采用两个参数: BASE_CLASS 和 类型。 这些类可以存储任何数据类型,则可以在 类型 参数指定。 它们从存储指针的某个非集合类派生;在 BASE_CLASS指定此基类。 对于数组,请使用 CObArrayCPtrArray。 用于列表,使用 CObListCPtrList

实际上,,在声明集合基于时, CObList假设,新类不仅继承其基类的成员,但是,它也声明大量个附加的类型安全的成员函数,并可通过封装提供类型安全的运算符对基类成员。 这些封装管理所有必要的类型转换。 例如:

CTypedPtrArray<CObArray, CPerson*> myArray;
CTypedPtrList<CPtrList, MY_STRUCT*> myList;

第一个示例声明类型的指针数组, myArray,从派生 CObArray。 数组存储并返回指向 CPerson 对象 (其中 CPerson 是从 CObject派生的类)。 可以调用任何 CObArray 成员函数,也可以调用新的类型安全的 GetAtElementAt 函数或使用类型安全的 [] 运算符。

第二个示例声明键入指针列表中, myList,从派生 CPtrList。 列表存储并返回指向 MY_STRUCT 对象。 根据 CPtrList 的类用于存储为 CObject没有派生对象的指针。 CTypedPtrList 有许多类型安全的成员函数: GetHeadGetTailRemoveHeadRemoveTailGetNextGetPrevGetAt

f728cbk3.collapse_all(zh-cn,VS.110).gif键入指针映射用法

键入指针映射类, CTypedPtrMap,采用三个参数: BASE_CLASS、 。 BASE_CLASS 参数指定派生新类的类: CMapPtrToWordCMapPtrToPtrCMapStringToPtrCMapWordToPtrCMapStringToOb,依此类推。 是类似于 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 类型,而不是指针或引用对于类型,类或结构必须具有复制构造函数。

有关更多信息,请参见 如何使类型安全集合

请参见

概念

集合