Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Die Microsoft Foundation Classes (MFC)-Bibliothek wird weiterhin unterstützt. Wir fügen jedoch keine Features mehr hinzu oder aktualisieren die Dokumentation.
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,CListCMapArrays, Listen und Zuordnungen von typisierten Zeigern
CTypedPtrArray,CTypedPtrListCTypedPtrMap
Die einfachen Auflistungsklassen werden alle von der Klasse CObjectabgeleitet, sodass sie die Serialisierung, dynamische Erstellung und andere Eigenschaften von CObjecterben. Für die typisierten Zeigersammlungsklassen müssen Sie die Klasse angeben, von der Sie ableiten, wobei es sich um eine der von MFC vordefinierten Zeigersammlungen ohne Vorlage handeln muss, wie CPtrList oder CPtrArray. Ihre neue Collection-Klasse erbt von der angegebenen Basisklasse und die Member-Funktionen der neuen Klasse verwenden gekapselte Aufrufe an die Member der Basisklasse, um die Typsicherheit zu gewährleisten.
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, wie
int,charundfloatC++-Strukturen und -Klassen
Andere Typen, die Sie definieren
Aus Gründen der Einfachheit 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, myList, die CPerson-Objekte speichert. Bestimmte Memberfunktionen der Auflistungsklassen verwenden Argumente, deren Typ durch den ARG_TYPE Vorlagenparameter angegeben wird. Die Mitgliedsfunktion der Klasse Add nimmt beispielsweise ein CArray-Argument entgegen.
CArray<CPerson, CPerson &> personArr;
CPerson person;
personArr.Add(person);
Einfache Kartennutzung
Die einfache Kartenklasse CMap akzeptiert 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 VALUE-Parameter gibt den Typ der in der Karte 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 in VALUE angegebenen Typ. Beispiel:
CMap<int, int, MY_STRUCT, MY_STRUCT &> myMap1;
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap2;
Im ersten Beispiel werden MY_STRUCT Werte gespeichert, darauf wird mit int Schlüsseln zugegriffen, und die aufgerufenen MY_STRUCT Elemente werden per Verweis zurückgegeben. Im zweiten Beispiel werden CPerson Werte gespeichert, auf sie wird mit CString Schlüsseln zugegriffen, und es wird Verweise auf die abgerufenen 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 in der Zuordnung als Elemente des Typs CString 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);
Verwendung von Typed-Pointer Collection-Vorlagen
Um die getypten 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.
Verwendung von Arrays und Listen mit typisierten Zeigern
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 Collection deklarieren, die z.B. auf CObList basiert, erbt die neue Klasse nicht nur die Member ihrer Basisklasse, sondern sie deklariert auch eine Reihe zusätzlicher typsicherer Member-Funktionen und Operatoren, die durch gekapselte Aufrufe an die Member der Basisklasse für Typsicherheit sorgen. Diese Kapselungen verwalten alle notwendigen Konversionen. Beispiel:
CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;
Im ersten Beispiel wird ein typisiertes Zeigerarray deklariert, myArray, das von CObArray abgeleitet ist. Das Array speichert und gibt Zeiger auf CPerson-Objekte zurück, wobei CPerson eine Klasse ist, die von CObject abgeleitet ist. Sie können eine beliebige CObArray-Memberfunktion aufrufen, oder Sie können die neuen typsicheren GetAt- und ElementAt-Funktionen aufrufen oder den typsicheren [ ]-Operator verwenden.
Das zweite Beispiel deklariert eine Liste mit typisierten Zeigern, myList, die von CPtrList abgeleitet ist. Zeiger auf MY_STRUCT-Objekte werden in der Liste gespeichert und zurückgegeben. Eine Klasse, die auf CPtrList basiert, wird verwendet, um Zeiger auf Objekte zu speichern, die nicht von CObject abgeleitet sind.
CTypedPtrList verfügt über eine Reihe typsicherer Memberfunktionen: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrev, und GetAt.
Typed-Pointer Kartennutzung
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 in CMap: Er gibt den Typ des Schlüssels an, der für Nachschlagevorgänge verwendet wird.
WERT ist analog zu VALUE in CMap: 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 Abbildung, die auf CMapPtrToPtr basiert — sie verwendet CString Schlüssel, die Zeigern auf MY_STRUCT zugeordnet sind. Sie können einen gespeicherten Zeiger nachschlagen, indem Sie eine typsichere Lookup Member-Funktion 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 Funktion GetNextAssoc iterieren. Sie können auch andere Member-Funktionen der Klasse CMapPtrToPtr aufrufen.
Das zweite Beispiel ist eine Map, die auf CMapStringToOb basiert – sie verwendet Zeichenfolgen, die gespeicherten Zeigern auf CMyObject-Objekte zugeordnet sind. Sie können die gleichen typsicheren Member verwenden, die im vorherigen Absatz beschrieben wurden, 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-Safe Collection.