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

  1. 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 Klasse CObArrayabgeleitet, eine der nicht auf Vorlagen basierenden, vordefinierten Klassen. GetAt gibt einen Zeiger auf ein CPerson -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 obigen for -Schleife sieht folgendermaßen aus:

    CPerson *thePerson = myArray[i];
    

    Dieser Operator ist sowohl in als const auch in nicht-Versionenconst vorhanden. Die const Version, die für const Arrays aufgerufen wird, kann nur auf der rechten Seite einer Zuordnungsanweisung angezeigt werden.

So durchlaufen Sie eine Liste

  1. Verwenden Sie die Memberfunktionen GetHeadPosition und GetNext 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 Klasse CObListabgeleitet. GetNext gibt einen Zeiger auf ein CPerson -Objekt zurück.

So durchlaufen Sie eine Zuordnung

  1. Verwenden Sie GetStartPosition , um an den Anfang der Zuordnung zu wechseln, und GetNextAssoc , 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 auf CPerson -Objekte speichert. Wenn Sie Zugriffsfunktionen wie z. B. GetNextAssocverwenden, bietet die Klasse Zeiger auf CPerson -Objekte. Wenn Sie stattdessen eine der nicht auf Vorlagen basierten Zuordnungsauflistungen verwenden, müssen Sie den zurückgegebenen CObject -Zeiger in einen Zeiger auf eine CPersonumwandeln.

    Hinweis

    Für nicht auf Vorlagen basierende Zuordnungen erfordert der Compiler einen Verweis auf einen CObject -Zeiger im letzten Parameter für GetNextAssoc. 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.

Siehe auch

Sammlungen