Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek vysvětluje typově bezpečné kolekční třídy založené na šablonách 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, ,CListCMapPole, seznamy a mapy typových ukazatelů
CTypedPtrArray, ,CTypedPtrListCTypedPtrMap
Jednoduché třídy kolekce jsou všechny odvozeny z třídy CObject, takže přebírají serializaci, dynamické vytvoření a další z vlastností 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 je odvozena ze zadané základní třídy a členské funkce nové třídy používají zapouzdřená volání členů základní třídy, aby byla zajištěna bezpečnost 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,charafloatStruktury 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 . Napří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á argument typu ARG_TYPE:
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 KLÍČE 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 typ ARG_VALUE je struktura nebo třída, ARG_VALUE parametr je obvykle odkazem na typ zadaný v value. Napří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 typu CString, ale ve funkcích jako SetAt jsou odkazovány prostřednictvím ukazatelů typu LPCSTR. Napří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í.
Typed-Pointer využití polí a seznamů
Třídy pole a seznam s typovanými ukazateli, 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 kolekcí tříd bez šablony, které ukládají 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ě, například CObList, nová třída nejen dědí členy své základní třídy, ale také deklaruje řadu dalších typově bezpečných členských funkcí a operátorů, které zajišťují typovou bezpečnost zapouzdřením volání členů základní třídy. Tento zapouzdřovací mechanismus zajišťuje všechny potřebné převody typů. Například:
CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;
První příklad deklaruje pole typových ukazatelů myArray, odvozené z CObArray. Pole ukládá a vrací ukazatele na CPerson objekty (kde CPerson je třída odvozená od CObject). Můžete volat libovolnou členovou funkci CObArray, nebo můžete volat nové typově bezpečné funkce GetAt a ElementAt nebo použít typově bezpečný operátor [ ].
Druhý příklad deklaruje seznam typů ukazatelů, 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 typově bezpečných členských funkcí: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrev a GetAt.
Typed-Pointer využití map
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, CMapPtrToPtr, CMapStringToPtr, CMapWordToPtr, CMapStringToObatd.
KEY je analogický ke KEY v CMap: Určuje typ klíče používaného pro vyhledávání.
HODNOTA je podobná hodnotě VALUE v CMap: Určuje typ objektu uloženého v mapě. Například:
CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;
První příklad je mapa založená na CMapPtrToPtr — používá klíče CString, které jsou mapovány na ukazatele MY_STRUCT. Uložený ukazatel můžete vyhledat zavoláním členské funkce typu Lookup, která je typově bezpečná. 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á řetězcové klíče mapované na ukazatele uložené na objekty CMyObject. Můžete použít stejné typově bezpečné členy popsané v předchozím odstavci, nebo můžete volat členy třídy CMapStringToOb.
Poznámka:
Pokud pro parametr class určíte typ struct nebo , nikoli ukazatel nebo odkaz na typ, musí mít třída nebo struktura kopírovací konstruktor.
Další informace naleznete v tématu Vytvoření kolekce Type-Safe.