Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel worden de type-veilige, op sjablonen gebaseerde verzamelingsklassen in MFC-versie 3.0 en hoger uitgelegd. Het gebruik van deze sjablonen om typeveilige verzamelingen te maken, is handiger en helpt u om typeveiligheid effectiever te bieden dan het gebruik van de verzamelingsklassen die niet op sjablonen zijn gebaseerd.
MFC definieert vooraf twee categorieën van op sjablonen gebaseerde verzamelingen.
Eenvoudige matrix-, lijst- en kaartklassen
CArray, ,CListCMapMatrices, lijsten en kaarten van getypte aanwijzers
CTypedPtrArray, ,CTypedPtrListCTypedPtrMap
De eenvoudige verzamelingsklassen zijn allemaal afgeleid van klasse CObject, zodat ze de serialisatie, het dynamisch maken en andere eigenschappen van CObjectovernemen. Voor de getypte aanwijzerverzamelingsklassen moet u de klasse opgeven waaruit u bent afgeleid. Dit moet een van de niet-sjabloonpointerverzamelingen zijn die vooraf zijn gedefinieerd door MFC, zoals CPtrList of CPtrArray. De nieuwe verzamelingsklasse neemt over van de opgegeven basisklasse en de ledenfuncties van de nieuwe klasse maken gebruik van ingekapselde aanroepen naar de leden van de basisklasse om typeveiligheid af te dwingen.
Zie Sjablonen in de C++-taalreferentie voor meer informatie over C++-sjablonen.
Eenvoudige matrix-, lijst- en kaartsjablonen gebruiken
Als u de eenvoudige verzamelingssjablonen wilt gebruiken, moet u weten welk soort gegevens u in deze verzamelingen kunt opslaan en welke parameters u in uw verzamelingsdeclaraties kunt gebruiken.
Eenvoudig matrix- en lijstgebruik
De eenvoudige matrix- en lijstklassen , CArray en CList, nemen twee parameters: TYPE en ARG_TYPE. Deze klassen kunnen elk gegevenstype opslaan, dat u opgeeft in de parameter TYPE :
Fundamentele C++-gegevenstypen, zoals
int,charenfloatC++ structuren en klassen
Andere typen die u definieert
Voor gemak en efficiëntie kunt u de parameter ARG_TYPE gebruiken om het type functieargumenten op te geven. Normaal gesproken geeft u ARG_TYPE op als verwijzing naar het type dat u hebt genoemd in de parameter TYPE . Voorbeeld:
CArray<int, int> myArray;
CList<CPerson, CPerson &> myList;
In het eerste voorbeeld wordt een arrayverzameling myArray gedeclareerd, die **int**s bevat. Het tweede voorbeeld declareert een lijstverzameling, myListwaarin objecten worden opgeslagen CPerson . Bepaalde lidfuncties van de verzamelingsklassen hebben argumenten waarvan het type is opgegeven door de parameter ARG_TYPE sjabloon. De lidfunctie van klasse Add neemt bijvoorbeeld CArray een ARG_TYPE argument:
CArray<CPerson, CPerson &> personArr;
CPerson person;
personArr.Add(person);
Eenvoudig kaartgebruik
De eenvoudige kaartklasse, CMap, heeft vier parameters: KEY, ARG_KEY, VALUE en ARG_VALUE. Net als bij de matrix- en lijstklassen kunnen de kaartklassen elk gegevenstype opslaan. In tegenstelling tot matrices en lijsten, die de gegevens die ze opslaan indexeren en rangschikken, worden sleutels en waarden gekoppeld: u opent een waarde die is opgeslagen in een kaart door de bijbehorende sleutel van de waarde op te geven. De parameter KEY specificeert het gegevenstype van de sleutels die worden gebruikt voor toegang tot gegevens die zijn opgeslagen in de kaart. Als het type SLEUTEL een structuur of klasse is, is de ARG_KEY parameter doorgaans een verwijzing naar het type dat is opgegeven in KEY. De parameter VALUE geeft het type van de items op die zijn opgeslagen in de kaart. Als het type ARG_VALUE een structuur of klasse is, is de ARG_VALUE parameter doorgaans een verwijzing naar het type dat is opgegeven in VALUE. Voorbeeld:
CMap<int, int, MY_STRUCT, MY_STRUCT &> myMap1;
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap2;
In het eerste voorbeeld worden MY_STRUCT waarden opgeslagen, via int sleutels benaderd, en worden de geraadpleegde MY_STRUCT items als referenties geretourneerd. In het tweede voorbeeld worden CPerson waarden opgeslagen, met CString sleutels benaderd en worden verwijzingen naar de benaderde items geretourneerd. In dit voorbeeld kan een eenvoudig adresboek worden weergegeven, waarin u personen op achternaam opzoekt.
Omdat de sleutelparameter van het type CString is en de parameter KEY_TYPE van het type LPCSTRis, worden de sleutels opgeslagen in de kaart als items van het type CString , maar worden verwezen in functies zoals SetAt via aanwijzers van het type LPCSTR. Voorbeeld:
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);
Sjablonen voor Typed-Pointer Collectie gebruiken
Als u de verzamelingssjablonen voor getypte aanwijzers wilt gebruiken, moet u weten welke soorten gegevens u in deze verzamelingen kunt opslaan en welke parameters u moet gebruiken in uw verzamelingsdeclaraties.
Typed-Pointer gebruik van matrices en lijsten
De getypte matrix- en lijstklassen , CTypedPtrArray en CTypedPtrList, nemen twee parameters: BASE_CLASS en TYPE. Deze klassen kunnen elk gegevenstype opslaan, dat u opgeeft in de parameter TYPE . Ze zijn afgeleid van een van de niet-template-verzamelingsklassen waarin aanwijzers worden opgeslagen; u deze basisklasse opgeeft in BASE_CLASS. Gebruik voor matrices een CObArray van beide of CPtrArray. Voor lijsten gebruikt u ofwel CObList of CPtrList.
Wanneer u een verzameling declareert op basis van, bijvoorbeeld CObList, neemt de nieuwe klasse niet alleen de leden van de basisklasse over, maar declareert het ook een aantal extra typeveilige lidfuncties en operators die u helpen typeveiligheid te bieden door aanroepen van de basisklasseleden in te kapselen. Deze inkapselingen beheren alle benodigde typeconversie. Voorbeeld:
CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;
In het eerste voorbeeld wordt een getypte aanwijzermatrix, myArrayafgeleid van CObArray. De matrix slaat de aanwijzers op en retourneert deze naar CPerson objecten (waarbij CPerson een klasse is afgeleid van CObject). U kunt elke CObArray-lidfunctie aanroepen, of u kunt de nieuwe typeveilige GetAt- en ElementAt-functies aanroepen of de typeveilige [ ]-operator gebruiken.
In het tweede voorbeeld wordt een getypte aanwijzerlijst, myList, afgeleid van CPtrList. In de lijst worden aanwijzers opgeslagen en geretourneerd naar MY_STRUCT objecten. Een klasse op CPtrList basis van wordt gebruikt voor het opslaan van aanwijzers naar objecten die niet zijn afgeleid van CObject.
CTypedPtrList heeft een aantal typeveilige lidfuncties: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrev en GetAt.
Typed-Pointer kaartgebruik
De kaartklasse van de getypte aanwijzer, CTypedPtrMap, heeft drie parameters: BASE_CLASS, SLEUTEL en WAARDE. Met de parameter BASE_CLASS wordt de klasse opgegeven waaruit de nieuwe klasse moet worden afgeleid: CMapPtrToWord, CMapPtrToPtr, CMapStringToPtrCMapWordToPtr, , CMapStringToObenzovoort.
KEY is vergelijkbaar met KEY in CMap: Hiermee wordt het type sleutel opgegeven dat wordt gebruikt voor zoekacties.
VALUE is vergelijkbaar met VALUE in CMap: Hiermee geeft u het type object op dat is opgeslagen op de kaart. Voorbeeld:
CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;
Het eerste voorbeeld is een kaart op basis van CMapPtrToPtr waarbij CString sleutels worden gebruikt die aan MY_STRUCT aanwijzers zijn toegewezen. U kunt een opgeslagen aanwijzer opzoeken door een typeveilige Lookup lidfunctie aan te roepen. U kunt de operator [] gebruiken om een opgeslagen aanwijzer op te zoeken en toe te voegen als deze niet wordt gevonden. En u kunt de kaart herhalen met behulp van de typeveilige GetNextAssoc functie. U kunt ook andere lidfuncties van klasse CMapPtrToPtraanroepen.
Het tweede voorbeeld is een kaart gebaseerd op CMapStringToOb: er worden stringsleutels gebruikt die zijn toegewezen aan opgeslagen pointers naar CMyObject-objecten. U kunt dezelfde typeveilige leden gebruiken die in de vorige alinea zijn beschreven, of u kunt leden van de klas CMapStringToObaanroepen.
Opmerking
Als u een class of struct type opgeeft voor de parameter VALUE , in plaats van een aanwijzer of verwijzing naar het type, moet de klasse of structuur een kopieerconstructor hebben.
Zie Een Type-Safe Verzameling maken voor meer informatie.