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:

Iterace pole

  1. Používejte sekvenční indexová čísla s členovou 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 z třídy CObArray, jedna z netemplate předdefinované třídy. 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 [ ] tak, aby bylo možné použít vlastní syntaxi pole-dolní index pro přístup k prvkům pole. Alternativou k příkazu v textu for výše uvedené smyčky je

    CPerson *thePerson = myArray[i];
    

    Tento operátor existuje v obou const verzích i v jinýchconst verzích. 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.

Iterace mapy

  1. Slouží GetStartPosition k získání dalšího klíče a hodnoty z mapy na začátek mapy a GetNextAssoc k opakovanému získání dalšího klíče a hodnoty, 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 GetNextAssocje , třída poskytuje ukazatele na CPerson objekty. Pokud místo toho použijete některou z netemplatních kolekcí mapování, musíte vrácený CObject ukazatel přetypovat na ukazatel na CPerson.

    Poznámka

    Pro netemplatní mapy kompilátor vyžaduje odkaz na CObject ukazatel v posledním parametru na 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