Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Den här artikeln förklarar de typsäkra mallbaserade samlingsklasserna i MFC version 3.0 och senare. Det är enklare att använda dessa mallar för att skapa typsäkra samlingar och ger bättre typsäkerhet än att använda samlingsklasserna som inte baseras på mallar.
MFC fördefinierade två kategorier av mallbaserade samlingar:
Enkla matris-, list- och kartklasser
CArray, ,CListCMapMatriser, listor och kartor över inskrivna pekare
CTypedPtrArray, ,CTypedPtrListCTypedPtrMap
De enkla samlingsklasserna härleds alla från klassen CObject, så de ärver serialiseringen, dynamisk skapande och andra egenskaper för CObject. De typade pekarsamlingsklasserna kräver att du specificerar den klass du härleder från – den måste vara en av de icke-template pekarsamlingar som är fördefinierade av MFC, till exempel CPtrList eller CPtrArray. Den nya samlingsklassen ärver från den angivna basklassen och den nya klassens medlemsfunktioner använder inkapslade anrop till basklassmedlemmarna för att framtvinga typsäkerhet.
Mer information om C++-mallar finns i Mallar i C++-språkreferensen.
Använda enkla matris-, list- och kartmallar
Om du vill använda enkla samlingsmallar måste du veta vilken typ av data du kan lagra i dessa samlingar och vilka parametrar som ska användas i dina samlingsdeklarationer.
Enkel matris- och listanvändning
De enkla matris- och listklasserna CArray och CList har två parametrar: TYPE och ARG_TYPE. Dessa klasser kan lagra alla datatyper som du anger i parametern TYPE :
Grundläggande C++-datatyper, till exempel
int,charochfloatC++-strukturer och -klasser
Andra typer som du definierar
För enkelhetens skull och effektivitet kan du använda parametern ARG_TYPE för att ange typen av funktionsargument. Vanligtvis anger du ARG_TYPE som referens till den typ som du namngav i parametern TYPE . Till exempel:
CArray<int, int> myArray;
CList<CPerson, CPerson &> myList;
I det första exemplet deklareras en matrissamling, myArray, som innehåller **int**s. I det andra exemplet deklareras en listsamling, myList, som lagrar CPerson objekt. Vissa medlemsfunktioner i samlingsklasserna tar argument vars typ anges av parametern ARG_TYPE mall. Medlemsfunktionen i Add klassen CArray tar till exempel ett ARG_TYPE argument:
CArray<CPerson, CPerson &> personArr;
CPerson person;
personArr.Add(person);
Enkel kartanvändning
Den enkla kartklassen CMap tar fyra parametrar: KEY, ARG_KEY, VALUE och ARG_VALUE. Precis som matris- och listklasserna kan kartklasserna lagra valfri datatyp. Till skillnad från matriser och listor, som indexerar och ordnar den data de lagrar, mappar associerar nycklar och värden: Du får åtkomst till ett värde som lagras i en map genom att ange värdets associerade nyckel. Parametern KEY anger datatypen för de nycklar som används för att komma åt data som lagras på kartan. Om typen av NYCKEL är en struktur eller klass är parametern ARG_KEY vanligtvis en referens till den typ som anges i KEY. Parametern VALUE anger typen av objekt som lagras på kartan. Om typen av ARG_VALUE är en struktur eller klass är parametern ARG_VALUE vanligtvis en referens till den typ som anges i VALUE. Till exempel:
CMap<int, int, MY_STRUCT, MY_STRUCT &> myMap1;
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap2;
Det första exemplet lagrar MY_STRUCT värden, kommer åt dem med int nycklar och returnerar objekt som används MY_STRUCT med referens. Det andra exemplet lagrar CPerson värden, kommer åt dem med CString nycklar och returnerar referenser till objekt som används. Det här exemplet kan representera en enkel adressbok där du söker efter personer med efternamn.
Eftersom nyckelparametern är av typen CString och parametern KEY_TYPE är av typen LPCSTR, lagras nycklarna på kartan som typobjekt CString men refereras i funktioner som SetAt genom pekare av typen .LPCSTR Till exempel:
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);
Använda Typed-Pointer samlingsmallar
Om du vill använda mallarna för typbeskriven pekare måste du veta vilka typer av data du kan lagra i dessa samlingar och vilka parametrar som ska användas i dina samlingsdeklarationer.
Typed-Pointer matris och listanvändning
Matrisen och listklasserna CTypedPtrArray och CTypedPtrList har två parametrar: BASE_CLASS och TYPE. Dessa klasser kan lagra valfri datatyp, som du anger i parametern TYPE . De härleds från en av de icke-template-samlingsklasser som lagrar pekare. du anger den här basklassen i BASE_CLASS. För matriser använder du antingen CObArray eller CPtrArray. För listor använder du antingen CObList eller CPtrList.
När du deklarerar en samling baserat på, till exempel CObList, ärver den nya klassen inte bara medlemmarna i basklassen, utan deklarerar också ett antal ytterligare typsäkra medlemsfunktioner och operatorer som hjälper till att ge typsäkerhet genom att kapsla in anrop till basklassmedlemmarna. Dessa inkapslingar hanterar all nödvändig typkonvertering. Till exempel:
CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;
I det första exemplet deklareras en typbeskriven pekarmatris, myArray, härledd från CObArray. Matrisen lagrar och returnerar pekare till CPerson objekt (där CPerson är en klass som härleds från CObject). Du kan anropa valfri CObArray medlemsfunktion, eller anropa den nya typsäkra GetAt funktionen och ElementAt funktionerna eller använda operatorn type-safe [ ] .
Det andra exemplet deklarerar en typad pekarlista, myList, härledd från CPtrList. Listan lagrar och returnerar pekare till MY_STRUCT objekt. En klass som baseras på CPtrList används för att lagra pekare till objekt som inte härleds från CObject.
CTypedPtrListhar ett antal typsäkra medlemsfunktioner: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, och GetPrevGetAt.
Typed-Pointer kartanvändning
Kartklassen typed-pointer, CTypedPtrMap, tar tre parametrar: BASE_CLASS, KEY och VALUE. Parametern BASE_CLASS anger vilken klass som den nya klassen ska härledas från: CMapPtrToWord, , CMapPtrToPtrCMapStringToPtr, CMapWordToPtr, CMapStringToOboch så vidare.
KEY är analogt med KEY i CMap: Den anger vilken typ av nyckel som används för sökningar.
VALUE motsvarar VALUE i CMap: Den anger vilken typ av objekt som lagras på kartan. Till exempel:
CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;
Det första exemplet är en karta baserad på CMapPtrToPtr – den använder CString nycklar mappade till pekare till MY_STRUCT. Du kan leta upp en lagrad pekare genom att anropa en typsäker Lookup medlemsfunktion. Du kan använda operatorn [ ] för att leta upp en lagrad pekare och lägga till den om den inte hittas. Och du kan iterera kartan med hjälp av funktionen type-safe GetNextAssoc . Du kan också anropa andra medlemsfunktioner i klassen CMapPtrToPtr.
Det andra exemplet är en karta som baseras på CMapStringToOb – den använder strängnycklar som mappats till lagrade pekare till CMyObject objekt. Du kan använda samma typsäkra medlemmar som beskrivs i föregående stycke, eller så kan du anropa medlemmar i klassen CMapStringToOb.
Anmärkning
Om du anger en class eller struct typ för parametern VALUE , i stället för en pekare eller referens till typen, måste klassen eller strukturen ha en kopieringskonstruktor.
Mer information finns i Skapa en Type-Safe-samling.