Přístup ke všem členům kolekce
Kolekce třídy array MFC – obě založený na šabloně a není – indexy lze použít pro přístup k jejich prvků.Třídy MFC seznam a mapa kolekce – oba založený na šabloně a není – použít indikátor typu pozice popisující dané pozici v rámci kolekce.Přístup z těchto kolekcí jednoho nebo více členů můžete nejprve inicializovat ukazatel polohy opakovaně předat kolekce poloze a požádá ji, vraťte se na další prvek.Není odpovědný za udržování informací o stavu o Průběh iterace v kolekci.Že informace jsou uchovávány v poloze ukazatele.Ale uvedeny konkrétní pozice kolekce je za vrácení další prvek.
Následující postupy popisují, jak iterovat přes tři hlavní typy kolekcí s MFC:
Iterace matice
Iterace seznamu
Iterace mapy
Iterace matice
Pořadová čísla indexu se používají GetAt členské funkce:
CTypedPtrArray<CObArray, CPerson*> myArray; myArray.Add(new CPerson()); for (int i = 0; i < myArray.GetSize();i++) { CPerson* thePerson = myArray.GetAt(i); thePerson->AssertValid(); }
Tento příklad používá ukazatel zadaného pole, které obsahuje odkazy na CPerson objektů.Pole je odvozena od třídy CObArray, jeden z nontemplate předdefinovaných tříd.GetAtVrací ukazatel CPerson objektu.Pro zadaný ukazatel kolekce třídy – matice či seznamy – první parametr určuje základní třídy; druhý parametr určuje typ pro ukládání.
CTypedPtrArray Třídy také přetížení [] operátor, takže můžete použít obvyklé syntaxe pole index přístup k prvkům matice.Alternativou k prohlášení v textu for je smyčka nad
CPerson* thePerson = myArray[i];
Tento operátor existuje v obou const a -b verze.Const verzi, která je vyvolána pro const matice, se mohou objevit pouze na pravé straně příkazu přiřazení.
Iterace seznamu
Pomocí funkce členů GetHeadPosition a GetNext prostřednictvím seznamu váš způsob práce:
CTypedPtrList<CObList, CPerson*> myList; myList.AddHead(new CPerson()); POSITION pos = myList.GetHeadPosition(); while(pos != NULL) { CPerson* thePerson = myList.GetNext(pos); thePerson->AssertValid(); }
V tomto příkladu je ukazatel zadaný seznam obsahuje odkazy na CPerson objektů.Seznam prohlášení podobá pro pole v postupu k matici , ale je odvozena od třídy CObList.GetNextVrací ukazatel CPerson objektu.
Iterace mapy
Použití GetStartPosition do začátku mapy a GetNextAssoc opakovaně získat další klíče a hodnoty z mapy, jak ukazuje následující příklad:
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 }
Tento příklad používá jednoduché mapy šablony (spíše než zadaný ukazatel kolekce), který používá CString klíčů a ukládá odkazy na CPerson objektů.Při použití funkce přístup jako GetNextAssoc, třída poskytuje odkazy na CPerson objektů.Používáte-li jednu mapu kolekce nontemplate místo, musí odevzdaných vrácené CObject ukazatele ukazatel na CPerson.
[!POZNÁMKA]
Kompilátor mapy nontemplate vyžaduje odkaz na CObject ukazatele v poslední parametr GetNextAssoc.Na vstupu musí odevzdaných ukazatele typu, jak je znázorněno v následujícím příkladu.
Šablona řešení je jednodušší a pomáhá zajistit vyšší bezpečnost typů.Kód nontemplate je složitější, jak můžete vidět zde:
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 }
Další informace naleznete v Odstranění všech objektů v kolekci CObject.