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.