Dostęp do wszystkich członków kolekcji
Klasy MFC tablicę kolekcji — zarówno oparty na szablonie i nie — dostęp ich elementów za pomocą indeksów.Klasy MFC listy i mapy kolekcji — zarówno oparty na szablonie i nie — użyj wskaźnika typu stanowisko do opisania danej pozycji w kolekcji.Uzyskać dostęp do jednego lub więcej członków tych zbiorów, należy najpierw zainicjować wskaźnik położenia wielokrotnie przekazania tej pozycji do zbierania i poproś go, aby powrócić do następnego elementu.Kolekcja nie jest odpowiedzialny za utrzymywanie stanu informacji o postępie iteracji.Te informacje są przechowywane w wskaźnik położenia.Jednak biorąc pod uwagę szczególne położenie, Kolekcja jest odpowiedzialny za zwrócenie następnego elementu.
Poniższe procedury przedstawiają iteracyjne trzy główne typy kolekcji z MFC:
Iterowanie tablicy
Iterowanie listy
Iterowanie mapę
Do iteracji tablicy
Używać kolejnych liczb indeksu z GetAt Członkowskich funkcji:
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 maszynowy wskaźnik, który zawiera odnośniki do CPerson obiektów.Tablica jest pochodną klasy CObArray, jeden z nontemplate wstępnie zdefiniowanych klas.GetAtZwraca wskaźnik do CPerson obiektu.Dla klas kolekcji maszynowy wskaźnika — tablic lub list — pierwszy parametr określa klasy podstawowej; drugi parametr określa typ przechowywania.
CTypedPtrArray Także klasy overloads operatora, dzięki czemu można użyć zwyczajowe składni indeks dolny tablicy do dostępu elementy tablicy.Alternatywą do instrukcji znajdującej się w treści for jest powyżej pętli
CPerson* thePerson = myArray[i];
Ten operator istnieje zarówno w const i -const wersji.Const wersji, która jest wywoływana dla const tablice, mogą być wyświetlane tylko na prawej stronie instrukcji przypisania.
Iteracyjne listy
Użyj funkcji elementów członkowskich GetHeadPosition i GetNext do sposobu pracy użytkownika za pośrednictwem listy:
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 maszynowy wskaźnik zawierają wskaźniki do CPerson obiektów.Deklaracja listy podobne do jednej tablicy w procedurze do iteracji tablicy , ale jest pochodną klasy CObList.GetNextZwraca wskaźnik do CPerson obiektu.
Iteracyjne mapę
Użyj GetStartPosition do początku mapy i GetNextAssoc wielokrotnie uzyskać następnego kluczy i wartości 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 prostych map (zamiast kolekcji maszynowy wskaźnik), która używa CString klawiszy i przechowuje wskaźniki do CPerson obiektów.Podczas korzystania z funkcji dostępu, takich jak GetNextAssoc, klasa udostępnia wskaźniki do CPerson obiektów.Jeśli używasz jednego z kolekcji nontemplate mapę 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 GetNextAssoc.Na wejściu musi oddać wskaźniki dla tego typu, jak w następnym przykładzie.
Roztwór szablonu jest prostsze i zapewnia lepsze bezpieczeństwo typu.Kod nontemplate jest bardziej skomplikowana, jak pokazano tutaj:
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.