Třídy založené na šablonách
Tento článek vysvětluje třídy kolekce založené na šablonách založené na typech v prostředí MFC verze 3.0 a novější. Použití těchto šablon k vytváření kolekcí bezpečných typů je pohodlnější a pomáhá efektivněji poskytovat bezpečnost typů než používání tříd kolekcí, které nejsou založené na šablonách.
MFC předdefinuje dvě kategorie kolekcí založených na šablonách:
Jednoduché třídy polí, seznamů a map
CArray
,CList
,CMap
Pole, seznamy a mapy typových ukazatelů
CTypedPtrArray
,CTypedPtrList
,CTypedPtrMap
Jednoduché třídy kolekce jsou všechny odvozeny z třídy CObject
, takže dědí serializace, dynamické vytváření a další vlastnosti CObject
. Třídy kolekce zadaných ukazatelů vyžadují, abyste zadali třídu, ze které pocházíte – což musí být jedna z netemplatních kolekcí ukazatelů předdefinovaných prostředím MFC, například CPtrList
nebo CPtrArray
. Vaše nová třída kolekce dědí ze zadané základní třídy a členské funkce nové třídy používají zapouzdřené volání členů základní třídy k vynucení bezpečnosti typů.
Další informace o šablonách jazyka C++ naleznete v tématu Šablony v referenční dokumentaci jazyka C++.
Použití jednoduchých polí, seznamů a mapových šablon
Pokud chcete použít jednoduché šablony kolekcí, potřebujete vědět, jaký druh dat můžete v těchto kolekcích uložit a jaké parametry použít v deklaracích kolekcí.
Použití jednoduchého pole a seznamu
Jednoduché třídy pole a seznamu, CArray a CList, mají dva parametry: TYPE a ARG_TYPE
. Tyto třídy mohou ukládat libovolný datový typ, který zadáte v parametru TYPE :
Základní datové typy jazyka C++, například
int
,char
afloat
Struktury a třídy jazyka C++
Další typy, které definujete
Pro usnadnění a efektivitu můžete pomocí parametru ARG_TYPE určit typ argumentů funkce. Obvykle zadáte ARG_TYPE jako odkaz na typ, který jste pojmenovali v parametru TYPE . Příklad:
CArray<int, int> myArray;
CList<CPerson, CPerson &> myList;
První příklad deklaruje kolekci polí, myArray
která obsahuje **int
**s. Druhý příklad deklaruje kolekci seznamů, myList
která ukládá CPerson
objekty. Některé členské funkce tříd kolekce mají argumenty, jejichž typ je určen parametrem ARG_TYPE šablony. Například Add
členová funkce třídy CArray
přebírá ARG_TYPE argument:
CArray<CPerson, CPerson &> personArr;
CPerson person;
personArr.Add(person);
Jednoduché použití map
Jednoduchá mapová třída CMap má čtyři parametry: KEY, ARG_KEY, VALUE a ARG_VALUE. Podobně jako třídy polí a seznamů mohou třídy mapování ukládat libovolný datový typ. Na rozdíl od polí a seznamů, které indexují a seřadí data uložená, mapy přidružují klíče a hodnoty: K hodnotě uložené v mapě přistupujete zadáním přidruženého klíče hodnoty. Parametr KEY určuje datový typ klíčů použitých pro přístup k datům uloženým v mapě. Pokud je typem KEY struktura nebo třída, ARG_KEY parametr je obvykle odkazem na typ zadaný v klíči. Parametr VALUE určuje typ položek uložených v mapě. Pokud je typ ARG_VALUE struktura nebo třída, je parametr ARG_VALUE obvykle odkazem na typ zadaný v hodnotě VALUE. Příklad:
CMap<int, int, MY_STRUCT, MY_STRUCT &> myMap1;
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap2;
První příklad ukládá MY_STRUCT
hodnoty, přistupuje k nim pomocí int
klíčů a vrací přístup k MY_STRUCT
položkám podle odkazu. Druhý příklad ukládá CPerson
hodnoty, přistupuje k nim pomocí CString
klíčů a vrací odkazy na přístupné položky. Tento příklad může představovat jednoduchý adresář, ve kterém vyhledáte osoby podle příjmení.
Protože je parametr KEY typu CString
a parametr KEY_TYPE je typu LPCSTR
, klíče jsou uloženy v mapě jako položky typuCString
, ale jsou odkazovány ve funkcích, jako SetAt
jsou ukazatele typu LPCSTR
. Příklad:
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);
Použití šablon kolekce typed-pointer
Pokud chcete použít šablony kolekce typu ukazatel, potřebujete vědět, jaké druhy dat můžete v těchto kolekcích uložit a jaké parametry použít v deklaracích kolekcí.
Použití pole se zadanými ukazateli a seznamem
Typed-pointer array a list třídy, CTypedPtrArray a CTypedPtrList, mají dva parametry: BASE_CLASS a TYPE. Tyto třídy mohou ukládat libovolný datový typ, který zadáte v parametru TYPE . Jsou odvozeny z jedné z nontemplate kolekce třídy, která ukládá ukazatele; tuto základní třídu zadáte v BASE_CLASS. Pro pole použijte buď CObArray
nebo CPtrArray
. Pro seznamy použijte buď CObList
nebo CPtrList
.
V důsledku toho, když deklarujete kolekci na základě řekněme CObList
, nová třída nejen dědí členy své základní třídy, ale také deklaruje řadu dalších typů bezpečných členských funkcí a operátorů, které pomáhají zajistit bezpečnost typů zapouzdřením volání členů základní třídy. Tyto zapouzdření spravují veškeré potřebné převody typů. Příklad:
CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;
První příklad deklaruje typ-ukazatel pole , myArray
odvozeno z CObArray
. Pole ukládá a vrací ukazatele na CPerson
objekty (kde CPerson
je třída odvozená od CObject
). Můžete volat libovolnou CObArray
členovou funkci nebo můžete volat nové typově bezpečné GetAt
funkce a ElementAt
funkce nebo použít operátor type-safe [ ].
Druhý příklad deklaruje typ-ukazatel seznam , myList
odvozený z CPtrList
. Seznam ukládá a vrací ukazatele na MY_STRUCT
objekty. Třída založená na CPtrList
je použita pro ukládání ukazatelů na objekty, které nejsou odvozeny z CObject
. CTypedPtrList
má řadu typů bezpečných členských funkcí: GetHead
, GetTail
, RemoveHead
, RemoveTail
, GetNext
, , GetPrev
, a GetAt
.
Použití mapy typu ukazatel
Třída mapování typu ukazatel CTypedPtrMap má tři parametry: BASE_CLASS, KLÍČ a HODNOTA. Parametr BASE_CLASS určuje třídu, ze které má být odvozena nová třída: CMapPtrToWord
, , CMapStringToPtr
CMapPtrToPtr
, CMapWordToPtr
, CMapStringToOb
atd. FUNKCE KEY je podobná klíči: CMap
Určuje typ klíče, který se používá pro vyhledávání. HODNOTA je podobná hodnotě VALUE v CMap
: Určuje typ objektu uloženého v mapě. Příklad:
CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;
První příklad je mapa založená na CMapPtrToPtr
– používá CString
klíče mapované na ukazatele na MY_STRUCT
. Uložený ukazatel můžete vyhledat zavoláním členské funkce bezpečného Lookup
typu. Pomocí operátoru [ ] můžete vyhledat uložený ukazatel a přidat ho, pokud nebyl nalezen. Mapu můžete iterovat pomocí funkce bezpečného GetNextAssoc
typu. Můžete také volat další členské funkce třídy CMapPtrToPtr
.
Druhý příklad je mapa založená na CMapStringToOb
– používá klíče řetězců mapované na uložené ukazatele na CMyObject
objekty. Můžete použít stejné typy bezpečných členů popsaných v předchozím odstavci nebo můžete volat členy třídy CMapStringToOb
.
Poznámka
Pokud pro parametr VALUE zadáte class
nebo struct
zadáte typ , nikoli ukazatel nebo odkaz na typ, třída nebo struktura musí mít konstruktor kopírování.
Další informace naleznete v tématu Vytvoření kolekce typu Sejf.