Sdílet prostřednictvím


Přístup ke všem členům kolekce

Třídy kolekce polí MFC ( založené na šablonách i ne ) používají indexy pro přístup k jejich prvkům. Třídy seznamů MFC a kolekcí map ( založené na šablonách i ne ) používají ukazatel typu POSITION k popisu dané pozice v kolekci. Pokud chcete získat přístup k jednomu nebo více členům těchto kolekcí, nejprve inicializujete indikátor pozice a pak tuto pozici opakovaně předáte kolekci a požádáte ji, aby vrátil další prvek. Kolekce neodpovídá za udržování informací o stavu o průběhu iterace. Informace se uchovávají v indikátoru pozice. Ale vzhledem k určité pozici je kolekce zodpovědná za vrácení dalšího prvku.

Následující postupy ukazují, jak iterovat nad třemi hlavními typy kolekcí poskytovaných v prostředí MFC:

Procházet polem

  1. Používejte sekvenční indexová čísla s členskou GetAt funkcí.

    CTypedPtrArray<CObArray, CPerson *> myArray;
    
    myArray.Add(new CPerson());
    for (int i = 0; i < myArray.GetSize(); i++)
    {
       CPerson *thePerson = myArray.GetAt(i);
       thePerson->AssertValid();
    }
    

    V tomto příkladu se používá pole typového ukazatele, které obsahuje ukazatele na CPerson objekty. Pole je odvozeno ze třídy CObArray, jedné z nešablonových předdefinovaných tříd. GetAt vrátí ukazatel na CPerson objekt. Pro třídy kolekce typových ukazatelů – pole nebo seznamy – první parametr určuje základní třídu; druhý parametr určuje typ, který se má uložit.

    Třída CTypedPtrArray také přetěžuje operátor [ ] aby bylo možné použít běžnou syntax pro indexování pole pro přístup k prvkům pole. Alternativou k příkazu v tělu výše uvedené smyčky for je

    CPerson *thePerson = myArray[i];
    

    Tento operátor existuje jak ve verzích const, tak i ve verzích, které nejsou const. Verze const , která je vyvolána pro const pole, se může zobrazit pouze na pravé straně příkazu přiřazení.

Iterace seznamu

  1. Použijte členské funkce GetHeadPosition a GetNext projděte si seznam:

    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 se používá typový seznam ukazatelů, který obsahuje ukazatele na CPerson objekty. Deklarace seznamu se podobá té pro pole v postupu Iterace pole , ale je odvozena z třídy CObList. GetNext vrátí ukazatel na CPerson objekt.

Iterovat mapu

  1. Pomocí GetStartPosition se dostanete na začátek mapy a pomocí GetNextAssoc opakovaně získáte další klíč a hodnotu 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 se používá jednoduchá šablona mapy (místo kolekce zadaných ukazatelů), která používá CString klíče a ukládá ukazatele na CPerson objekty. Při použití přístupových funkcí, jako je GetNextAssoc, třída poskytuje ukazatele na objekty CPerson. Pokud místo toho použijete některou z netemplatních kolekcí map, musíte vrácený CObject ukazatel přetypovat na ukazatel na CPerson.

    Poznámka:

    Pro mapy bez šablon kompilátor vyžaduje referenci na ukazatel CObject v posledním parametru GetNextAssoc. Při zadávání je nutné přetypovat ukazatele na tento typ, jak je znázorněno v dalším příkladu.

    Řešení šablony je jednodušší a pomáhá zajistit lepší bezpečnost typů. Netemplatní kód je složitější, jak vidíte tady:

    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 CObject.

Viz také

kolekce