Zugreifen auf alle Elemente einer Auflistung
Die MFC-Arrayauflistungsklassen – sowohl die vorlagenbasierten als auch die nicht vorlagenbasierten – verwenden Indizes, um auf ihre Elemente zuzugreifen. Die MFC-Listen- und Zuordnungsauflistungsklassen – sowohl die vorlagenbasierten als auch die nicht vorlagenbasierten – verwenden einen Indikator vom Typ POSITION zum Beschreiben einer bestimmten Position in der Auflistung. Für den Zugriff auf einen oder mehrere Member dieser Auflistungen zunächst initialisieren Sie zunächst den Positionsindikator und übergeben dann diese Position wiederholt an die Auflistung und fordert Sie auf das nächste Element zurückzugeben. Die Auflistung ist nicht verantwortlich für die Verwaltung von Statusinformationen hinsichtlich des Fortschritts der Iteration. Diese Informationen werden im Positionsindikator gespeichert. Bei einer bestimmten Position ist die Auflistung jedoch dafür verantwortlich, das nächste Element zurückzugeben.
Die folgenden Verfahren zeigen, wie Sie die drei Haupttypen von Auflistungen, die mit MFC bereitgestellt werden, durchlaufen:
So durchlaufen Sie ein Array
Verwenden Sie die sequenziellen Indexzahlen mit der
GetAt
-Memberfunktion:CTypedPtrArray<CObArray, CPerson *> myArray; myArray.Add(new CPerson()); for (int i = 0; i < myArray.GetSize(); i++) { CPerson *thePerson = myArray.GetAt(i); thePerson->AssertValid(); }
Dieses Beispiel verwendet ein typisiertes Zeigerarray, das enthält Zeiger auf
CPerson
-Objekte enthält. Das Array wird von der KlasseCObArray
abgeleitet, eine der nicht auf Vorlagen basierenden, vordefinierten Klassen.GetAt
gibt einen Zeiger auf einCPerson
-Objekt zurück. Für typisierte Zeigerauflistungsklassen – Arrays oder Listen – gibt der erste Parameter die Basisklasse an; der zweite Parameter gibt den zu speichernden Typ an.Die
CTypedPtrArray
Klasse überlastet auch den [ ] -Operator, sodass Sie die übliche Array-Subscript-Syntax verwenden können, um auf Elemente eines Arrays zuzugreifen. Eine Alternative zur Anweisung im Hauptteil der obigenfor
-Schleife sieht folgendermaßen aus:CPerson *thePerson = myArray[i];
Dieser Operator ist sowohl in als
const
auch in nicht-Versionenconst
vorhanden. Dieconst
Version, die fürconst
Arrays aufgerufen wird, kann nur auf der rechten Seite einer Zuordnungsanweisung angezeigt werden.
So durchlaufen Sie eine Liste
Verwenden Sie die Memberfunktionen
GetHeadPosition
undGetNext
zum Navigieren durch die Liste:CTypedPtrList<CObList, CPerson *> myList; myList.AddHead(new CPerson()); POSITION pos = myList.GetHeadPosition(); while (pos != NULL) { CPerson *thePerson = myList.GetNext(pos); thePerson->AssertValid(); }
Dieses Beispiel verwendet eine typisierte Zeigerliste, um Zeiger auf
CPerson
-Objekte zu enthalten. Die List-Deklaration ähnelt der für das Array in der Prozedur So durchlaufen Sie ein Array , sie wird jedoch von der KlasseCObList
abgeleitet.GetNext
gibt einen Zeiger auf einCPerson
-Objekt zurück.
So durchlaufen Sie eine Zuordnung
Verwenden Sie
GetStartPosition
, um an den Anfang der Zuordnung zu wechseln, undGetNextAssoc
, um den nächsten Schlüssel und Wert wiederholt aus der Zuordnung abzurufen, wie im folgenden Beispiel gezeigt: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 }
Dieses Beispiel verwendet eine einfache Zuordnungsvorlage (statt einer typisierten Zeigerauflistung), die
CString
-Schlüssel nutzt und Zeiger aufCPerson
-Objekte speichert. Wenn Sie Zugriffsfunktionen wie z. B.GetNextAssoc
verwenden, bietet die Klasse Zeiger aufCPerson
-Objekte. Wenn Sie stattdessen eine der nicht auf Vorlagen basierten Zuordnungsauflistungen verwenden, müssen Sie den zurückgegebenenCObject
-Zeiger in einen Zeiger auf eineCPerson
umwandeln.Hinweis
Für nicht auf Vorlagen basierende Zuordnungen erfordert der Compiler einen Verweis auf einen
CObject
-Zeiger im letzten Parameter fürGetNextAssoc
. Bei der Eingabe müssen Sie die Zeiger in diesen Typ umwandeln, wie im nächsten Beispiel gezeigt.Die Vorlagenlösung ist einfacher und bietet eine bessere Typsicherheit. Der nicht auf Vorlagen basierende Code ist komplizierter, wie Sie hier sehen können:
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 ... }
Weitere Informationen finden Sie unter Löschen aller Objekte in einer CObject-Sammlung.