Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
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 typierten 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 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. ,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, myListdie Objekte speichert CPerson . Bestimmte Memberfunktionen der Auflistungsklassen verwenden Argumente, deren Typ durch den ARG_TYPE Vorlagenparameter angegeben wird. Die Memberfunktion der Klasse CArray verwendet zAdd. B. ein ARG_TYPE Argument:
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 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 in VALUE angegebenen Typ. 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 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);
Verwenden von Typed-Pointer Sammlungsvorlagen
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.
Typed-Pointer Array- 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.
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 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-Safe Collection.