Sdílet prostřednictvím


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.

Viz také

Koncepty

Kolekce