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:
Einfache Array-, Listen- und Kartenklassen
CArray
,CList
,CMap
Arrays, Listen und Zuordnungen von typierten Zeigern
CTypedPtrArray
,CTypedPtrList
,CTypedPtrMap
Die einfachen Auflistungsklassen werden alle von der Klasse CObject
abgeleitet, sodass sie die Serialisierung, dynamische Erstellung und andere Eigenschaften von CObject
erben. 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. ,char
undfloat
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, myArray
die **int
**s enthält. Im zweiten Beispiel wird eine Listenauflistung deklariert, myList
die 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 LPCSTR
ist, werden die Schlüssel als Elemente des Typs CString
in der Zuordnung gespeichert, aber in Funktionen wie SetAt
z. B. durch Zeiger des Typs LPCSTR
referenziert. 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, myArray
das 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, myList
die 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
. CTypedPtrList
verfügt über eine Reihe typsicherer Memberfunktionen: GetHead
, , GetTail
, RemoveHead
, RemoveTail
, GetNext
, , und GetPrev
GetAt
.
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
, , CMapPtrToPtr
CMapStringToPtr
, CMapWordToPtr
, CMapStringToOb
usw. 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_STRUCT
zugeordnet 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 CMapPtrToPtr
aufrufen.
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 CMapStringToOb
aufrufen.
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.