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
Deklarieren Sie eine Variable des Auflistungsklassentyps. Beispiel:
CList<int, int> m_intList;
Rufen Sie die Memberfunktionen des Auflistungsobjekts auf. Beispiel:
m_intList.AddTail(100); m_intList.RemoveAll();
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 CArray
CList
und 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 CArray
Klassen 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
, DWORD
und 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:
Verwenden Sie bei Bedarf die Nichtvorlagenauflistungen mit Typ casting. Dies ist der einfachere Ansatz.
Leiten Sie eine nicht vorlagensichere Sammlung ab und erweitern Sie sie.
So verwenden Sie die Nichtvorlagensammlungen mit Typwandlung
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 vonCObject
. EineCObList
Auflistung ist definiert, um Zeiger zuCObject
halten. Wenn Sie ein Objekt aus der Liste abrufen, müssen Sie das Ergebnis möglicherweise in den richtigen Typ umwandeln, da dieCObList
Funktionen ZeigerCObject
zurückgeben. Wenn Sie beispielsweise Objekte in einerCObList
Auflistung speichernCPerson
, müssen Sie ein abgerufenes Element in einen Zeiger auf einCPerson
Objekt umwandeln. Im folgenden Beispiel wird eineCObList
Auflistung zum HaltenCPerson
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
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
halteobjektenCPerson
abgeleitet haben, können Sie die WrapperfunktionenAddHeadPerson
undGetHeadPerson
, 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 dieGetHeadPerson
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.