访问集合的所有成员
MFC 数组集合类基于模板和不使用 —索引来访问它们的元素。MFC 列表,并映射的集合类基于模板和不使用 —类型 位置 指示符描述集合中的特定位置。访问这些集合,则的一个或多个成员初始化位置指示器重复并首先通过位置到集合并要求它返回下一个元素。集合传递到维护有关迭代进度的状态信息不负责。该信息在位置指示器保留。但是,为特定位置,集合传递到返回下一个元素负责。
下面的过程演示如何循环访问集合的三种主要类型随 MFC:
重复数组
重复列表
重复映射
重复数组
使用 GetAt 成员函数的索引号:
CTypedPtrArray<CObArray, CPerson*> myArray; myArray.Add(new CPerson()); for (int i = 0; i < myArray.GetSize();i++) { CPerson* thePerson = myArray.GetAt(i); thePerson->AssertValid(); }
此示例使用包含指向 CPerson 对象的一个类型化指针数组。数组从类 CObArray,某个非预定义的类派生的。GetAt 返回指向 CPerson 对象。为类型化指针集合类 —数组或列表 —第一个参数指定基类;第二个参数指定类型存储。
CTypedPtrArray 类还重载 [] 运算符,以便可以使用习惯的数组下标语法来访问数组的元素。对语句的替换在上面 for 的循环体。
CPerson* thePerson = myArray[i];
此运算符存在 const 和非const 版本。const 版本,为 const 数组调用,可以在赋值语句右侧仅显示。
重复列表
使用成员函数 GetHeadPosition 和 GetNext 通过列表反向:
CTypedPtrList<CObList, CPerson*> myList; myList.AddHead(new CPerson()); POSITION pos = myList.GetHeadPosition(); while(pos != NULL) { CPerson* thePerson = myList.GetNext(pos); thePerson->AssertValid(); }
此示例使用类型化指针列表包含指向 CPerson 对象。列表声明类似于该程序 重复数组 数组的,但从类派生 CObList。GetNext 返回指向 CPerson 对象。
重复映射
重复使用 GetStartPosition 获取对映射的开始和 GetNextAssoc 到获取下一个键和值从映射,如显示按以下示例:
CMap<CString, LPCTSTR, CPerson*, CPerson*> myMap; CPerson myPerson; myMap.SetAt(_T("Bill"), &myPerson); POSITION pos = myMap.GetStartPosition(); while(pos != NULL) { CPerson* pPerson; CString string; // Get key (string) and value (pPerson) myMap.GetNextAssoc(pos, string, pPerson); // Use string and pPerson }
此示例使用一个简单的映射模板 (而不是类型化指针集合) 使用 CString 键并存储指向 CPerson 对象。当您使用访问功能 (如 GetNextAssoc时,类提供 CPerson 对象。如果您使用某个非映射的集合,必须将返回的 CObject 指向的指针。 CPerson。
说明 对非映射,编译器需要一对最后一个参数的一 CObject 指向 GetNextAssoc。如下面的示例所示,在输入,必须将您的指针为该类型,。
模板解决方案更加简单,并提供了更好的类型安全。非代码更为复杂的,因此,如此处所示:
CMapStringToOb myMap; // A nontemplate collection class CPerson myPerson; myMap.SetAt(_T("Bill"), &myPerson); POSITION pos = myMap.GetStartPosition(); while(pos != NULL) { CPerson* pPerson; CString string; // Gets key (string) and value (pPerson) myMap.GetNextAssoc(pos, string, (CObject*&)pPerson); ASSERT(pPerson->IsKindOf( RUNTIME_CLASS(CPerson))); // Use string and pPerson }
有关更多信息,请参见 删除在 CObject 集合中的任何对象。