Přístup ke všem členům kolekce
Kolekce tříd MFC pole – obě založené na šablonách a ne – přístup k jejich elementům pomocí indexů.Třídy knihovny MFC mapa a seznam kolekce – obě založené na šablonách a ne – pomocí indikátoru typu pozice popisující danou pozici v rámci kolekce.Pro přístup k členům jeden nebo více z těchto kolekcí, můžete nejprve inicializovat ukazatel polohy opakovaně předat tuto pozici v kolekci a požádá ji, aby se vrátit na další prvek.Není odpovědné za udržování stavu informace o průběhu iterace v kolekci.Že informace uloženy v umístění ukazatele.Ale s ohledem konkrétní pozici, kolekce je zodpovědná za vrácení na další prvek.
Následující postupy ukazují, jak iterovat přes tři hlavní typy kolekcí, které jsou dodávané s knihovnou MFC:
Iterace pole
Iterace seznamu
Iterace mapa
Chcete-li iterovat matice
Použití sekvenčního čísla indexů s 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á typový ukazatel pole, které obsahuje odkazy na CPerson objekty.Pole je odvozena ze třídy CObArray, jeden nontemplate předdefinované třídy.GetAtvrací ukazatel na CPerson objektu.Ukazatel typové kolekce tříd – matice či seznamy – první parametr určuje základní třídy; druhý parametr určuje typ pro ukládání.
CTypedPtrArray Také třídy přetížení operátor tak, aby bylo možné používat běžné pole index syntaxe pro přístup prvky pole. Alternativou k příkazu v těle for je smyčka nad
CPerson* thePerson = myArray[i];
Tento operátor existuje v obou const a non-b verze.Const verzi, která je vyvolána pro const pole, se může objevit pouze na pravé straně příkazu přiřazení.
Iterace seznamu
Pomocí členské funkce GetHeadPosition a GetNext k propracovávat se seznamem:
CTypedPtrList<CObList, CPerson*> myList; myList.AddHead(new CPerson()); POSITION pos = myList.GetHeadPosition(); while(pos != NULL) { CPerson* thePerson = myList.GetNext(pos); thePerson->AssertValid(); }
Tento příklad používá ukazatel zadaný seznam obsahuje odkazy na CPerson objekty.Seznam prohlášení podobá pole v proceduře iterovat matice je odvozena z třídy, ale CObList.GetNextvrací ukazatel na CPerson objektu.
K mapě
Použití GetStartPosition na začátku mapy a GetNextAssoc opakovaně získat následující klíče a hodnoty z mapy, jak je znázorněno v následujícím příkladu:
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 }
V tomto příkladu šablona jednoduchá mapa (spíše než ukazatele typové kolekce), který používá CString klíče a ukládá odkazy na CPerson objekty.Při použití funkce aplikace access, jako GetNextAssoc, třída poskytuje odkazy na CPerson objekty.Pokud používáte jeden z kolekce mapování nontemplate místo, musíte přetypovat vrácené CObject ukazatel na ukazatel CPerson.
[!POZNÁMKA]
Nontemplate map, kompilátor vyžaduje odkaz na CObject ukazatele v poslední parametr GetNextAssoc.Na vstupu musíte přetypovat ukazatele na tento typ, jak je znázorněno v následujícím příkladu.
Řešení šablony 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 tématu Odstranění všech objektů v kolekci třídy CObject.