Uzyskiwanie dostępu do wszystkich elementów członkowskich kolekcji

Kolekcja klas array MFC — zarówno oparty na szablonie i nie — używać indeksów do dostępu do ich elementów.Klasy MFC listy i mapy kolekcji — zarówno oparty na szablonie i nie — użyć wskaźnika typu pozycji do opisu danej pozycji w kolekcji.Aby uzyskać dostęp do jednego lub kilku członków tych zbiorów, najpierw zainicjować wskaźnik położenia i następnie wielokrotnie przekazać tej pozycji do kolekcji i zwrócić następnego elementu.Kolekcja nie jest odpowiedzialny za utrzymywanie informacji o stanie o postępie iteracji.Te informacje są przechowywane w wskaźnik położenia.Jednakże biorąc pod uwagę określonego stanowiska, Kolekcja jest odpowiedzialny za zwrócenie następnego elementu.

Poniższe procedury pokazują, jak przejść przez trzy główne rodzaje kolekcje dostarczane z MFC:

  • Iterowanie tablicy

  • Iterowanie listy

  • Iterowanie mapy

Iteracyjne tablicy

  • Używać kolejnych liczb indeksu z GetAt funkcji składowej:

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

    W tym przykładzie użyto tablicy wpisywanych wskaźnika, które zawierają wskaźniki do CPerson obiektów.Tablica jest pochodną klasy CObArray, jeden z nontemplate wstępnie zdefiniowanych klas.GetAtZwraca wskaźnik do CPerson obiektu.Dla wskaźnika wpisywanych w klasach kolekcji — tablicach lub list — pierwszy parametr określa klasy podstawowej; drugi parametr określa typ do przechowywania.

    CTypedPtrArray Klasy także przeciążenia operatora tak, że można użyć zwyczajowe składni indeks dolny tablicy do dostępu do elementów tablicy. Alternatywą dla instrukcji w treści for jest powyżej pętli

    CPerson* thePerson = myArray[i];
    

    Ten operator istnieje zarówno w const i non-const wersji.Const wersji, która jest wywoływana dla const tablicami, mogą być wyświetlane tylko po prawej stronie instrukcji przypisania.

Aby przejść do listy

  • Użyj funkcji elementów członkowskich GetHeadPosition i GetNext do sposobu pracy użytkownika na liście:

    CTypedPtrList<CObList, CPerson*> myList;
    
    myList.AddHead(new CPerson());
    POSITION pos = myList.GetHeadPosition();
    while(pos != NULL)
    {
       CPerson* thePerson = myList.GetNext(pos);
       thePerson->AssertValid();
    }
    

    W tym przykładzie użyto listy wskaźnik wpisywanych do zawierają wskaźniki do CPerson obiektów.Deklarację listy opisany w tablicy w procedurze do iteracji tablica , ale wywodzi się z klasy CObList.GetNextZwraca wskaźnik do CPerson obiektu.

Iteracyjne mapy

  • Użycie GetStartPosition aby dostać się do początku mapy i GetNextAssoc Aby wielokrotnie Następny klucz i wartość z mapy, jak pokazano w następującym przykładzie:

    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
    }       
    

    W tym przykładzie użyto szablonu mapy proste (a nie do kolekcji wpisywanych wskaźnik), który używa CString klawiszy i przechowuje wskaźniki do CPerson obiektów.Użycie funkcji dostępu, takich jak GetNextAssoc, klasy udostępnia wskaźniki do CPerson obiektów.Jeśli używasz jednej z kolekcji mapę nontemplate zamiast, musi oddać zwracane CObject wskaźnik do wskaźnika do CPerson.

    [!UWAGA]

    Dla nontemplate mapy, kompilator wymaga odwołania do CObject wskaźnik w ostatnim parametrem do GetNextAssoc.Na wejściu które rzutowane wskaźniki dla tego typu, jak pokazano w następnym przykładzie.

    Rozwiązanie szablonu jest prostsza i zapewnia lepsze bezpieczeństwo typów.Kod nontemplate jest bardziej skomplikowane, jak pokazano poniżej:

    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
    }
    

Aby uzyskać więcej informacji, zobacz Usuwanie wszystkich obiektów w kolekcji CObject.

Zobacz też

Koncepcje

Kolekcje