Sdílet prostřednictvím


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 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, chara float

  • 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í, myArraykterá obsahuje **int**s. Druhý příklad deklaruje kolekci seznamů, myListkterá 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 , myArrayodvozeno 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 , myListodvozený 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, , CMapStringToPtrCMapPtrToPtr, CMapWordToPtr, CMapStringToObatd. FUNKCE KEY je podobná klíči: CMapUrč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.

Viz také

Kolekce