Freigeben über


Gewusst wie: Erstellen einer typsicheren Auflistung

Dieser Artikel beschreibt, wie Auflistungen für typsicheres eigener Datentypen macht. Folgende Themen werden behandelt:

  • Verwenden von auf Vorlagen basierenden Typsicherheit für Klassen

  • Implementieren von Hilfsfunktionen

  • Verwendung der nicht auf Vorlagen basierenden Auflistungsklassen

Die Microsoft Foundation Class-Bibliothek stellt vordefinierte typsichere Auflistungen auf Grundlage C++-Vorlagen bereit. Da von Vorlagen sind, unterstützen diese Klassen, die Typsicherheit und Benutzerfreundlichkeit ohne die angegebene Typumwandlung und weitere Aufgaben bereitzustellen, wenn es für diesen Zweck eine nicht auf Vorlagen basierende Klassen beteiligte, verwenden. Das MFC-Beispiel COLLECT Sie veranschaulicht die Verwendung von auf Vorlagen basierenden Auflistungsklassen in einer MFC-Anwendung. Im Allgemeinen verwenden Sie diese Klassen, wenn Sie neuen Auflistungscode schreiben.

Verwenden von auf Vorlagen basierenden Typsicherheit für Klassen

So auf Vorlagen basierende Klassen verwenden

  1. Deklarieren Sie eine Variable des Auflistungsklassentyps. Beispiel:

    CList<int, int> m_intList;
    
  2. Rufen Sie die Memberfunktionen des Auflistungsobjekts auf. Beispiel:

    m_intList.AddTail(100);
    m_intList.RemoveAll();
    
  3. Falls notwendig implementieren Sie unter Hilfsfunktionen und SerializeElements. Informationen zum Implementieren dieser Funktionen, finden Sie unter Implementieren von Hilfsfunktionen.

In diesem Beispiel wird die Deklaration einer Liste von ganzen Zahlen. Der erste Parameter im Schritt 1 ist der Typ der Daten, die als Elemente der Liste gespeichert werden. Gibt der zweite Parameter an, wie die Daten übergeben werden und von Memberfunktionen der Auflistungsklasse, wie Hinzufügen und GetAt zurückgegeben werden sollen.

Implementieren von Hilfsfunktionen

Die Vorlage gebildeten Auflistungsklassen CArray, CList und globale Hilfsfunktionen CMap mit fünf, die Sie für die abgeleitete Auflistungsklasse nach Bedarf anpassen können. Informationen zu diesen Hilfsfunktionen, finden Sie unter Auflistungsklassen-Hilfen in der MFC-Referenz. Implementierung der Serialisierungsfunktionen ist für die meisten Anwendungen von den vorlagenbasierten Auflistungsklassen erforderlich.

Serialisieren von Elementen

CArray, CList und CMap-Klassen rufen SerializeElements auf, um Elemente zu speichern oder sie in einem Archiv zu lesen.

Die Standardimplementierung der SerializeElements - Hilfsfunktion führt eine bitweise Schreiben von Objekten dem Archiv oder einem bitweisen Lesen aus dem Archiv auf Objekte, abhängig davon, ob die Objekte gespeichert werden oder dem Archiv abgerufen. Überschreiben Sie SerializeElements, wenn diese Aktion nicht geeignet ist.

Wenn die Auflistung Objekte gespeichert, die von CObject abgeleitet werden und Sie das IMPLEMENT_SERIAL-Makro in der Implementierung der Auflistungselementklasse verwenden, können Sie die Serialisierungsfunktionalität nutzen, die in CArchive und CObject erstellt wird:

CArray< CPerson, CPerson& > personArray;

template <> void AFXAPI SerializeElements <CPerson> (CArchive& ar, 
   CPerson* pNewPersons, INT_PTR nCount)
{
   for (int i = 0; i < nCount; i++, pNewPersons++)
   {
      // Serialize each CPerson object
      pNewPersons->Serialize(ar);
   }
}

Die überladenen Einfügungsoperatoren für CArchive rufen CObject::Serialize (oder eine Überschreibung der Funktion) für jedes CPerson-Objekt auf.

Verwendung der nicht auf Vorlagen basierenden Auflistungsklassen

MFC unterstützt auch die Auflistungsklassen, die mit MFC 1.0. Diese Klassen sind nicht basierend auf Vorlagen. Sie können verwendet werden, um Daten der unterstützten Typen CObject*, UINT, DWORD und CString enthalten. Sie können diese vordefinierten Auflistungen verwenden (wie CObList) um Auflistungen alle Objekte enthalten, die von CObject abgeleitet werden. MFC stellt auch weitere vordefinierte Auflistungen, die primitive Typen wie UINT und void-Zeiger (void*) aufzunehmen. Im Allgemeinen ist es jedoch oft hilfreich, typsicheren eigene Auflistungen definieren, um Objekte eine spezifischere Klasse und ihre Ableitungen aufzunehmen. Beachten Sie, dass so mit den Auflistungsklassen nicht basierend auf Vorlagen vorhanden, ist mehr Arbeit als die Verwendung der vorlagenbasierten Klassen.

Es gibt zwei Möglichkeiten, typsichere Auflistungen mit den nicht vorlagenbasierten Auflistungen erstellen:

  1. Verwenden Sie die nicht vorlagenbasierten Auflistungen, mit durch Typumwandlung. Dies ist der einfacheren Ansatz.

  2. Sind von und erweitern Sie eine nicht auf Vorlagen basierende typsichere Auflistung.

Um die nicht vorlagenbasierten Auflistungen mit Typumwandlung verwenden

  • Verwenden Sie eine der nicht auf Vorlagen basierenden Klassen, wie CWordArray, direkt.

    Beispielsweise können Sie ein CWordArray erstellen und alle 32-Bit-Werten hinzufügen, und rufen sie ab. Es gibt keine weitere Vorteile. Sie verwenden nur die vordefinierte Funktionen.

    Sie können eine vordefinierte Auflistung, z CObList auch verwenden, um alle Objekte aufzunehmen wird von CObject abgeleitet. Eine CObList-Auflistung wird definiert, um Zeiger auf CObject enthält. Wenn Sie ein Objekt aus der Liste abrufen, müssen Sie möglicherweise das Ergebnis den richtigen Typ umwandeln, da die Funktionen CObList Zeiger auf CObject zurückgeben. Wenn Sie CPerson-Objekte in einer CObList-Auflistung speichern, müssen Sie ein abgerufenes Element umwandeln, um ein Zeiger auf ein CPerson-Objekt sein. Im folgenden Beispiel wird eine CObList-Auflistung, um CPerson-Objekte enthalten:

    CPerson* p1 = new CPerson();
    CObList myList;
    
    myList.AddHead(p1);   // No cast needed
    CPerson* p2 = (CPerson*)myList.GetHead();
    

    Diese Technik einen vordefinierten Auflistungstyp ggf. aus verwenden und von umwandeln kann für viele der Auflistungsanforderungen geeignet. Wenn Sie weitere Funktionalität oder mehr Typsicherheit benötigen, verwenden Sie eine Vorlage gebildete Klasse, oder halten Sie die folgende Prozedur ein.

Um eine nicht auf Vorlagen basierende typsichere Auflistung ableiten und erweitern

  • Leiten Sie eine eigene Auflistungsklasse aus einer der vordefinierten nicht auf Vorlagen basierenden Klassen.

    Wenn Sie eine Klasse ableiten, können Sie typsichere Wrapperfunktionen hinzufügen, um eine typsichere Schnittstelle zu vorhandenen Features bereitzustellen.

    Wenn Sie eine Liste von CObList ableiten, um CPerson-Objekte enthält, könnten Sie die Wrapperfunktionen AddHeadPerson und GetHeadPerson, wie unten dargestellt hinzugefügt.

    class CPersonList : public CObList
    {
    public:
        void AddHeadPerson( CPerson* person )
            {AddHead( person );}
    
        const CPerson* GetHeadPerson()
            {return (CPerson*)GetHead();}
    };
    

    Diese Wrapperfunktionen stellen eine typsichere Weise, CPerson-Objekten von der abgeleiteten Liste hinzuzufügen und abzurufen. Sie können sehen, dass die Funktion für GetHeadPerson, Sie einfach die Typumwandlung kapseln.

    Sie können auch neue Funktionen hinzufügen, indem Sie neue Funktionen definieren, die die Leistungsfähigkeit der Auflistung statt vorhandene Funktionen erweitern in den typsicheren Wrappern nur, einbindend. Zum Beispiel beschreibt der Artikel Löschen aller Objekte in einer CObject-Auflistung eine Funktion, um alle Objekte zu löschen, die in einer Liste enthalten sind. Diese Funktion kann zur abgeleiteten Klasse als Memberfunktion hinzugefügt werden.

Siehe auch

Konzepte

Auflistungen