Vorlagenbasierte Klassen

In diesem Artikel werden die typsicheren vorlagenbasierten Sammlungsklassen in MFC, Version 3.0 und höher, erläutert. Die Verwendung dieser Vorlagen zum Erstellen von typsicheren Sammlungen ist praktischer und trägt dazu bei, die Typsicherheit effektiver zu gewährleisten als die Verwendung der Sammlungsklassen, die nicht auf Vorlagen basieren.

MFC vordefinierte zwei Kategorien vorlagenbasierter Sammlungen:

Die einfachen Auflistungsklassen werden alle von der Klasse CObjectabgeleitet, sodass sie die Serialisierung, dynamische Erstellung und andere Eigenschaften von CObjecterben. Für die typisierten Zeigerauflistungsklassen müssen Sie die Klasse angeben, von der Sie abgeleitet werden. Dabei muss es sich um eine der von MFC vordefinierten Nichtvorlagenzeigerauflistungen handeln, z CPtrList . B. oder CPtrArray. Ihre neue Sammlungsklasse erbt von der angegebenen Basisklasse, und die Memberfunktionen der neuen Klasse verwenden gekapselte Aufrufe der Basisklassenmember, um die Typsicherheit zu erzwingen.

Weitere Informationen zu C++-Vorlagen finden Sie unter Vorlagen in der C++-Sprachreferenz.

Verwenden von einfachen Array-, Listen- und Kartenvorlagen

Um die einfachen Sammlungsvorlagen zu verwenden, müssen Sie wissen, welche Art von Daten Sie in diesen Sammlungen speichern können und welche Parameter in Ihren Sammlungsdeklarationen verwendet werden sollen.

Einfache Array- und Listenverwendung

Die einfachen Array- und Listenklassen CArray und CList verwenden zwei Parameter: TYPE und ARG_TYPE. Diese Klassen können jeden beliebigen Datentyp speichern, den Sie im TYPE-Parameter angeben:

  • Grundlegende C++-Datentypen, z int. B. , charund float

  • C++-Strukturen und -Klassen

  • Andere Typen, die Sie definieren

Zur Vereinfachung und Effizienz können Sie den parameter ARG_TYPE verwenden, um den Typ der Funktionsargumente anzugeben. In der Regel geben Sie ARG_TYPE als Verweis auf den typ an, den Sie im TYPE-Parameter benannt haben. Beispiel:

CArray<int, int> myArray;
CList<CPerson, CPerson &> myList;

Im ersten Beispiel wird eine Arrayauflistung deklariert, myArraydie **int**s enthält. Im zweiten Beispiel wird eine Listenauflistung deklariert, myListdie Objekte speichert CPerson . Bestimmte Memberfunktionen der Auflistungsklassen verwenden Argumente, deren Typ durch den ARG_TYPE Vorlagenparameter angegeben wird. Die Memberfunktion der Klasse verwendet zAdd. B. ein ARG_TYPE Argument:CArray

CArray<CPerson, CPerson &> personArr;
CPerson person;
personArr.Add(person);

Einfache Kartennutzung

Die einfache Kartenklasse CMap verwendet vier Parameter: KEY, ARG_KEY, VALUE und ARG_VALUE. Wie die Array- und Listenklassen können die Kartenklassen jeden beliebigen Datentyp speichern. Im Gegensatz zu Arrays und Listen, die die gespeicherten Daten indizieren und ordnen, werden Schlüssel und Werte zugeordnet: Sie greifen auf einen in einer Karte gespeicherten Wert zu, indem Sie den zugeordneten Schlüssel des Werts angeben. Der KEY-Parameter gibt den Datentyp der Schlüssel an, die für den Zugriff auf in der Karte gespeicherte Daten verwendet werden. Wenn der Typ von KEY eine Struktur oder Klasse ist, ist der ARG_KEY Parameter in der Regel ein Verweis auf den in KEY angegebenen Typ. Der PARAMETER VALUE gibt den Typ der in der Zuordnung gespeicherten Elemente an. Wenn der Typ von ARG_VALUE eine Struktur oder Klasse ist, ist der ARG_VALUE Parameter in der Regel ein Verweis auf den typ, der in VALUE angegeben ist. Beispiel:

CMap<int, int, MY_STRUCT, MY_STRUCT &> myMap1;
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap2;

Im ersten Beispiel werden Werte gespeichert MY_STRUCT , nach int Schlüsseln darauf zugegriffen und auf Elemente nach Verweis zurückgegeben MY_STRUCT . Im zweiten Beispiel werden Werte gespeichert CPerson , nach CString Schlüsseln zugegriffen und Verweise auf elemente zurückgegeben. Dieses Beispiel kann ein einfaches Adressbuch darstellen, in dem Sie Personen nach Nachnamen nachschlagen.

Da der KEY-Parameter vom Typ CString ist und der parameter KEY_TYPE vom Typ LPCSTRist, werden die Schlüssel als Elemente des Typs CString in der Zuordnung gespeichert, aber in Funktionen wie SetAt z. B. durch Zeiger des Typs LPCSTRreferenziert. Beispiel:

CMap<CString, LPCTSTR, CPerson, CPerson &> myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);

Verwenden von Typed-Pointer-Auflistungsvorlagen

Um die Typ-Zeiger-Sammlungsvorlagen zu verwenden, müssen Sie wissen, welche Arten von Daten Sie in diesen Auflistungen speichern können, und welche Parameter in Ihren Sammlungsdeklarationen verwendet werden sollen.

Typ-Zeigerarray und Listenverwendung

Die typisierten Zeigerarrays und Listenklassen CTypedPtrArray und CTypedPtrList verwenden zwei Parameter: BASE_CLASS und TYPE. Diese Klassen können jeden beliebigen Datentyp speichern, den Sie im TYPE-Parameter angeben. Sie werden von einer der Nichtvorlagensammlungsklassen abgeleitet, die Zeiger speichert; Sie geben diese Basisklasse in BASE_CLASS an. Verwenden Sie für Arrays entweder CObArray oder CPtrArray. Verwenden Sie für Listen entweder CObList oder CPtrList.

Wenn Sie eine Auflistung basierend auf, z CObList. B., deklarieren, erbt die neue Klasse nicht nur die Member der Basisklasse, sondern deklariert auch eine Reihe zusätzlicher typensicherer Memberfunktionen und Operatoren, die die Typsicherheit durch Kapselung von Aufrufen der Basisklassenmember unterstützen. Diese Kapselungen verwalten alle erforderlichen Typkonvertierungen. Beispiel:

CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;

Im ersten Beispiel wird ein typiertes Zeigerarray deklariert, myArraydas von CObArray. Das Array speichert und gibt Zeiger auf CPerson Objekte zurück (dabei CPerson handelt es sich um eine klasse, die von CObject). Sie können eine beliebige CObArray Memberfunktion aufrufen, oder Sie können die neue typsichere GetAt Funktion und ElementAt Funktionen aufrufen oder den typsicheren [ ] Operator verwenden.

Im zweiten Beispiel wird eine typgesteuerte Zeigerliste deklariert, myListdie von CPtrList. In der Liste werden Zeiger auf MY_STRUCT Objekte gespeichert und zurückgegeben. Eine auf dieser Klasse basierende CPtrList Klasse wird zum Speichern von Zeigern auf Objekte verwendet, die nicht von CObject. CTypedPtrListverfügt über eine Reihe typsicherer Memberfunktionen: GetHead, , GetTail, RemoveHead, RemoveTail, GetNext, , und GetPrevGetAt.

Verwendung der Typ-Zeiger-Karte

Die typisierte Zeigerzuordnungsklasse CTypedPtrMap akzeptiert drei Parameter: BASE_CLASS, KEY und VALUE. Der parameter BASE_CLASS gibt die Klasse an, von der die neue Klasse abgeleitet werden soll: CMapPtrToWord, , CMapPtrToPtrCMapStringToPtr, CMapWordToPtr, CMapStringToObusw. KEY ist analog zu KEY inCMap: Er gibt den Typ des Schlüssels an, der für Nachschlagevorgänge verwendet wird. WERT ist analog zu VALUE inCMap: Es gibt den Typ des objekts an, das in der Karte gespeichert ist. Beispiel:

CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;

Das erste Beispiel ist eine Karte, die CMapPtrToPtr auf - sie verwendet CString Schlüssel, die Zeigern MY_STRUCTzugeordnet sind. Sie können einen gespeicherten Zeiger nachschlagen, indem Sie eine typsichere Lookup Memberfunktion aufrufen. Sie können den [ ] -Operator verwenden, um einen gespeicherten Zeiger nachzuschlagen und hinzuzufügen, wenn sie nicht gefunden wurde. Und Sie können die Karte mit der typsicheren GetNextAssoc Funktion durchlaufen. Sie können auch andere Memberfunktionen der Klasse CMapPtrToPtraufrufen.

Das zweite Beispiel basiert auf CMapStringToOb einer Karte – es verwendet Zeichenfolgenschlüssel, die gespeicherten Zeigern auf CMyObject Objekte zugeordnet sind. Sie können die gleichen typsicheren Member verwenden, die im vorherigen Absatz beschrieben werden, oder Sie können Member der Klasse CMapStringToObaufrufen.

Hinweis

Wenn Sie einen class Oder-Typ struct für den WERT-Parameter anstelle eines Zeigers oder Verweises auf den Typ angeben, muss die Klasse oder Struktur über einen Kopierkonstruktor verfügen.

Weitere Informationen finden Sie unter How to Make a Type-Tresor Collection.

Siehe auch

Sammlungen