Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano typowo bezpieczne klasy kolekcji oparte na szablonach w MFC w wersji 3.0 lub nowszej. Użycie tych szablonów do tworzenia kolekcji bezpiecznych typów jest wygodniejsze i pomaga zapewnić bezpieczeństwo typów bardziej efektywnie niż używanie klas kolekcji nie opartych na szablonach.
MFC wstępnie definiuje dwie kategorie kolekcji opartych na szablonach.
Proste klasy tablic, listy i map
CArray, ,CListCMapTablice, listy i mapy wpisanych wskaźników
CTypedPtrArray, ,CTypedPtrListCTypedPtrMap
Wszystkie proste klasy kolekcji pochodzą z klasy CObject, więc dziedziczą serializację, tworzenie dynamiczne oraz inne właściwości klasy CObject. Klasy kolekcji wskaźników typowanych wymagają określenia klasy, z której pochodzisz — która musi należeć do jednej z kolekcji wskaźników niebędących szablonami wstępnie zdefiniowanych przez MFC, takich jak CPtrList lub CPtrArray. Nowa klasa kolekcji dziedziczy z określonej klasy bazowej, a funkcje składowe nowej klasy używają zabezpieczonych wywołań do składowych klasy bazowej w celu zapewnienia bezpieczeństwa typów.
Aby uzyskać więcej informacji na temat szablonów języka C++, zobacz Szablony w dokumentacji języka C++.
Używanie podstawowych szablonów tablic, list i map
Aby użyć prostych szablonów kolekcji, musisz wiedzieć, jakiego rodzaju dane można przechowywać w tych kolekcjach i jakie parametry mają być używane w deklaracjach kolekcji.
Użycie prostej tablicy i listy
Proste klasy tablic i list, CArray i CList, przyjmują dwa parametry: TYPE i ARG_TYPE. Te klasy mogą przechowywać dowolny typ danych określony w parametrze TYPE :
Podstawowe typy danych języka C++, takie jak
int,charifloatStruktury i klasy języka C++
Inne typy, które definiujesz
Dla wygody i wydajności można użyć parametru ARG_TYPE , aby określić typ argumentów funkcji. Zazwyczaj należy określić ARG_TYPE jako odwołanie do typu o nazwie w parametrze TYPE . Przykład:
CArray<int, int> myArray;
CList<CPerson, CPerson &> myList;
W pierwszym przykładzie zadeklarowana jest kolekcja tablic myArray, która zawiera elementy typu **int**. Drugi przykład deklaruje kolekcję list , myListktóra przechowuje CPerson obiekty. Niektóre funkcje składowe klas kolekcji przyjmują argumenty, których typ jest określony przez parametr szablonu ARG_TYPE. Na przykład Add funkcja składowa klasy CArray przyjmuje argument ARG_TYPE :
CArray<CPerson, CPerson &> personArr;
CPerson person;
personArr.Add(person);
Proste użycie mapy
Prosta klasa mapy, CMap, przyjmuje cztery parametry: KEY, ARG_KEY, VALUE i ARG_VALUE. Podobnie jak w przypadku klas tablic i list, klasy map mogą przechowywać dowolny typ danych. W przeciwieństwie do tablic i list, które indeksują i porządkują przechowywane dane, mapy kojarzą klucze z wartościami: uzyskujesz dostęp do wartości przechowywanej w mapie, określając skojarzony klucz wartości. Parametr KEY określa typ danych kluczy używanych do uzyskiwania dostępu do danych przechowywanych na mapie. Jeśli typ KLUCZA jest strukturą lub klasą, parametr ARG_KEY jest zazwyczaj odwołaniem do typu określonego w kluczu. Parametr VALUE określa typ elementów przechowywanych na mapie. Jeśli typ ARG_VALUE jest strukturą lub klasą, parametr ARG_VALUE jest zazwyczaj odwołaniem do typu określonego w wartości. Przykład:
CMap<int, int, MY_STRUCT, MY_STRUCT &> myMap1;
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap2;
Pierwszy przykład przechowuje MY_STRUCT wartości, uzyskuje do nich dostęp za pomocą int kluczy i zwraca dostępne elementy MY_STRUCT przez referencję. Drugi przykład przechowuje CPerson wartości, uzyskuje do nich dostęp za pomocą CString kluczy i zwraca odwołania do elementów, do których uzyskuje się dostęp. Ten przykład może reprezentować prostą książkę adresową, w której wyszukujesz osoby według nazwiska.
Ponieważ parametr KEY jest typu CString, a parametr KEY_TYPE jest typu LPCSTR, klucze są przechowywane na mapie jako elementy typu CString, ale są przywoływane w funkcjach, takich jak SetAt, przez wskaźniki typu LPCSTR. Przykład:
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);
Używanie szablonów kolekcji Typed-Pointer
Aby użyć szablonów kolekcji wskaźników typowanych, musisz wiedzieć, jakie rodzaje danych można przechowywać w tych kolekcjach i jakich parametrów używać w deklaracjach kolekcji.
Typed-Pointer użycie tablicy i listy
Klasy tablic typowanych wskaźników i list, CTypedPtrArray i CTypedPtrList, przyjmują dwa parametry: BASE_CLASS i TYPE. Te klasy mogą przechowywać dowolny typ danych określony w parametrze TYPE . Pochodzą one z jednej z nieplaterowych klas kolekcji, które przechowują wskaźniki; należy określić tę klasę bazową w BASE_CLASS. W przypadku tablic użyj polecenia CObArray lub CPtrArray. W przypadku list użyj polecenia CObList lub CPtrList.
W efekcie, po zadeklarowaniu kolekcji na podstawie, powiedzmy CObList, nowa klasa nie tylko dziedziczy elementy członkowskie swojej klasy bazowej, ale także deklaruje szereg dodatkowych funkcji składowych i operatorów bezpiecznych typów, które pomagają zapewnić bezpieczeństwo typów przez hermetyzowanie wywołań do składowych klasy bazowej. Te hermetyzacje zarządzają wszystkimi niezbędnymi konwersjami typów. Przykład:
CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;
Pierwszy przykład deklaruje tablicę wskaźników typowanych, myArray, pochodzącą z CObArray. Tablica przechowuje i zwraca wskaźniki do CPerson obiektów (gdzie CPerson jest klasą pochodzącą z CObjectklasy ). Można wywołać dowolną CObArray funkcję składową lub wywołać nowe funkcje typu GetAt i ElementAt lub użyć operatora [ ] typu zabezpieczonego.
W drugim przykładzie zadeklarowano listę typowanych wskaźników, myList, która pochodzi z CPtrList. Lista przechowuje i zwraca wskaźniki do MY_STRUCT obiektów. Klasa oparta na CPtrList jest używana do przechowywania wskaźników do obiektów, które nie pochodzą z CObjectklasy .
CTypedPtrList ma szereg funkcji składowych bezpiecznych typów: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrev i GetAt.
użycie mapy Typed-Pointer
Klasa mapy typu wskaźnik, CTypedPtrMap, przyjmuje trzy parametry: BASE_CLASS, KEY i VALUE.
Parametr BASE_CLASS określa klasę, z której ma pochodzić nowa klasa: CMapPtrToWord, , CMapPtrToPtrCMapStringToPtr, CMapWordToPtr, i CMapStringToObtak dalej.
KLUCZ jest analogiczny do klucza w pliku CMap: określa typ klucza używanego do wyszukiwania.
WARTOŚĆ jest analogiczna do wartości w elemecie CMap: określa typ obiektu przechowywanego na mapie. Przykład:
CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;
Pierwszy przykład to mapa oparta na CMapPtrToPtr — używa kluczy CString mapowanych na wskaźniki do MY_STRUCT. Możesz wyszukać przechowywany wskaźnik, wywołując bezpieczną dla typu funkcję składową Lookup. Możesz użyć operatora [ ] , aby wyszukać przechowywany wskaźnik i dodać go, jeśli nie zostanie znaleziony. I można iterować mapę przy użyciu funkcji bezpiecznej GetNextAssoc typu. Można również wywołać inne funkcje składowe klasy CMapPtrToPtr.
Drugi przykład to mapa oparta na CMapStringToOb — używa kluczy ciągów mapowanych do przechowywanych wskaźników do CMyObject obiektów. Można użyć tych samych składowych typu bezpiecznego opisanych w poprzednim akapicie lub wywołać składowe członkowskie klasy CMapStringToOb.
Uwaga / Notatka
Jeśli określisz typ class lub struct dla parametru VALUE, zamiast wskaźnika lub odwołania do tego typu, klasa albo struktura musi mieć konstruktor kopiujący.
Aby uzyskać więcej informacji, zobacz How to Make a Type-Safe Collection (Jak utworzyć kolekcję Type-Safe).