Gewusst wie: Erstellen einer typsicheren Auflistung

In diesem Artikel wird erläutert, wie Sie typsichere Sammlungen für Ihre eigenen Datentypen erstellen. Dabei werden folgende Themen behandelt:

Die Microsoft Foundation-Klassenbibliothek bietet vordefinierte typsichere Auflistungen basierend auf C++-Vorlagen. Da sie Vorlagen sind, tragen diese Klassen dazu bei, die Typsicherheit und benutzerfreundliche Bedienung zu gewährleisten, ohne dass die Typwandlung und andere zusätzliche Arbeit daran beteiligt sind, eine Nichtvorlagenklasse für diesen Zweck zu verwenden. Das MFC-Beispiel COLLECT veranschaulicht die Verwendung vorlagenbasierter Sammlungsklassen in einer MFC-Anwendung. Verwenden Sie diese Klassen im Allgemeinen jedes Mal, wenn Sie neuen Auflistungscode schreiben.

Verwenden von vorlagenbasierten Klassen für typbasierte Tresor ty

So verwenden Sie vorlagenbasierte Klassen

  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. Implementieren Sie bei Bedarf die Hilfsfunktionen und SerializeElements. Informationen zum Implementieren dieser Funktionen finden Sie unter Implementieren von Hilfsfunktionen.

Dieses Beispiel zeigt die Deklaration einer Liste ganzzahliger Zahlen. Der erste Parameter in Schritt 1 ist der Datentyp, der als Elemente der Liste gespeichert ist. Der zweite Parameter gibt an, wie die Daten an Memberfunktionen der Auflistungsklasse übergeben und von diesen zurückgegeben werden sollen, z Add . B. und GetAt.

Implementieren von Hilfsfunktionen

Die vorlagenbasierten Sammlungsklassen CArrayCListund CMap verwenden fünf globale Hilfsfunktionen, die Sie nach Bedarf für ihre abgeleitete Sammlungsklasse anpassen können. Informationen zu diesen Hilfsfunktionen finden Sie in der MFC-Referenz unter Sammlungsklassenhilfsprogramme. Die Implementierung der Serialisierungsfunktion ist für die meisten Verwendungen der vorlagenbasierten Auflistungsklassen erforderlich.

Serialisieren von Elementen

Die CArrayKlassen CList, und CMap die Klassen rufen SerializeElements auf, um Sammlungselemente zu speichern oder aus einem Archiv zu lesen.

Die Standardimplementierung der SerializeElements Hilfsfunktion schreibt ein bitweises Schreiben von Objekten in das Archiv oder ein bitweises Lesen aus dem Archiv in die Objekte, je nachdem, ob die Objekte im Archiv gespeichert oder aus dem Archiv abgerufen werden. Überschreiben SerializeElements , wenn diese Aktion nicht geeignet ist.

Wenn Ihre Sammlung Objekte speichert, die von CObject dieser abgeleitet sind und Sie das IMPLEMENT_SERIAL Makro in der Implementierung der Sammlungselementklasse verwenden, können Sie die CArchive in und CObject:

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ügeoperatoren für CArchive den Aufruf CObject::Serialize (oder eine Außerkraftsetzung dieser Funktion) für jedes CPerson Objekt.

Verwenden von Klassen der Nontemplate-Auflistung

MFC unterstützt auch die Sammlungsklassen, die mit MFC Version 1.0 eingeführt wurden. Diese Klassen basieren nicht auf Vorlagen. Sie können verwendet werden, um Daten der unterstützten Typen CObject*, , UINT, DWORDund CString. Sie können diese vordefinierten Auflistungen (z CObList. B. ) verwenden, um Sammlungen aller objekte zu speichern, die von CObject. MFC stellt auch andere vordefinierte Auflistungen bereit, um primitive Typen wie z UINT . B. leere Zeiger (void*) zu enthalten. Im Allgemeinen ist es jedoch häufig nützlich, eigene typsichere Auflistungen zu definieren, um Objekte einer spezifischeren Klasse und ihrer Ableitungen zu speichern. Beachten Sie, dass dies mit den Auflistungsklassen, die nicht auf Vorlagen basieren, mehr Arbeit als die Verwendung der vorlagenbasierten Klassen ist.

Es gibt zwei Möglichkeiten zum Erstellen von typsicheren Sammlungen mit den Nichtvorlagensammlungen:

  1. Verwenden Sie bei Bedarf die Nichtvorlagenauflistungen mit Typ casting. Dies ist der einfachere Ansatz.

  2. Leiten Sie eine nicht vorlagensichere Sammlung ab und erweitern Sie sie.

So verwenden Sie die Nichtvorlagensammlungen mit Typwandlung

  1. Verwenden Sie eine der nicht vorlagenfreien Klassen, z CWordArray. B. direkt.

    Sie können z. B. einen CWordArray beliebigen 32-Bit-Wert erstellen und dann abrufen. Es gibt nichts mehr zu tun. Sie verwenden lediglich die vordefinierte Funktionalität.

    Sie können auch eine vordefinierte Auflistung verwenden, z CObList. B. zum Speichern von Objekten, die von CObject. Eine CObList Auflistung ist definiert, um Zeiger zu CObjecthalten. Wenn Sie ein Objekt aus der Liste abrufen, müssen Sie das Ergebnis möglicherweise in den richtigen Typ umwandeln, da die CObList Funktionen Zeiger CObjectzurückgeben. Wenn Sie beispielsweise Objekte in einer CObList Auflistung speichernCPerson, müssen Sie ein abgerufenes Element in einen Zeiger auf ein CPerson Objekt umwandeln. Im folgenden Beispiel wird eine CObList Auflistung zum Halten CPerson von Objekten verwendet:

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

    Diese Technik der Verwendung eines vordefinierten Sammlungstyps und einer Gussform kann für viele Ihrer Sammlungsanforderungen ausreichend sein. Wenn Sie weitere Funktionen oder mehr Typsicherheit benötigen, verwenden Sie eine vorlagenbasierte Klasse, oder befolgen Sie das nächste Verfahren.

So leiten Sie eine nicht vorlagensichere Sammlung ab und erweitern sie

  1. Leiten Sie Ihre eigene Sammlungsklasse von einer der vordefinierten Nichtvorlagenklassen ab.

    Wenn Sie Ihre Klasse ableiten, können Sie typsichere Wrapperfunktionen hinzufügen, um eine typsichere Schnittstelle für vorhandene Funktionen bereitzustellen.

    Wenn Sie z. B. eine Liste von CObList halteobjekten CPerson abgeleitet haben, können Sie die Wrapperfunktionen AddHeadPerson und GetHeadPerson, wie unten dargestellt, hinzufügen.

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

    Diese Wrapperfunktionen bieten eine typsichere Möglichkeit zum Hinzufügen und Abrufen CPerson von Objekten aus der abgeleiteten Liste. Sie können sehen, dass Sie für die GetHeadPerson Funktion einfach die Typwandlung kapseln.

    Sie können auch neue Funktionen hinzufügen, indem Sie neue Funktionen definieren, die die Funktionen der Sammlung erweitern, anstatt nur vorhandene Funktionen in typsicheren Wrappern umzuschließen. Beispielsweise beschreibt der Artikel "Alle Objekte löschen" in einer CObject-Auflistung eine Funktion zum Löschen aller In einer Liste enthaltenen Objekte. Diese Funktion kann der abgeleiteten Klasse als Memberfunktion hinzugefügt werden.

Siehe auch

Sammlungen