Porady: tworzenie bezpiecznej kolekcji
W tym artykule wyjaśniono, jak zrobić kolekcje typ palety dla własne typy danych.Tematy obejmują:
Korzystanie z klas opartych na szablonie dla bezpieczeństwa typu
Realizacji podstawowych funkcji
Korzystanie z klas kolekcji nontemplate
Microsoft Foundation Class Library zawiera wstępnie zdefiniowane kolekcje typ palety na podstawie szablonów języka C++.Ponieważ są szablony klasy te pomagają typu bezpieczeństwo i łatwość użycia bez typu rzutowania i innych dodatkowych prac związanych z za pomocą klasy nontemplate w tym celu.Próbki MFC zbierania zademonstrowano użycie klasy kolekcja opartych na szablonie w aplikacji MFC.Ogólnie rzecz biorąc użyć tych klas w każdej chwili, co napiszesz nowy kod kolekcje.
Korzystanie z klas opartych na szablonie dla bezpieczeństwa typu
Aby skorzystać z klas opartych na szablonie
Deklaruje zmienną typu klasy kolekcji.Na przykład:
CList<int, int> m_intList;
Należy wywołać element członkowski funkcje obiektu kolekcji.Na przykład:
m_intList.AddTail(100); m_intList.RemoveAll();
W razie potrzeby wykonania funkcji pomocnika i SerializeElements.Informacje na temat wdrażania tych funkcji, zobacz Wykonania funkcji pomocnika.
Ten przykład pokazuje deklaracji na liście liczb całkowitych.Pierwszy parametr w kroku 1 jest typ danych przechowywane jako elementy listy.Drugi parametr określa, jak dane są przekazywane do i zwrócone przez funkcje składowe klasy zbioru, takich jak Dodaj i GetAt.
Realizacji podstawowych funkcji
W klasach kolekcji oparty na szablonie CArray, CList, i CMap za pomocą pięciu funkcji globalnych pomocnika, które można dostosować odpowiednio dla swojej klasy pochodnej kolekcji.Aby uzyskać informacje na temat tych funkcji pomocnika, zobacz Pomocników klasy kolekcji w Odwołanie MFC.Implementacja funkcji serializacji jest niezbędne dla większości zastosowań w klasach kolekcji oparty na szablonie.
Szeregowania elementów
CArray, CList, I CMap wywołanie klasy SerializeElements do przechowywania elementów kolekcji do lub odczytać je z archiwum.
Domyślna implementacja z SerializeElements funkcja pomocnika nie logiczną zapisu z obiektów do archiwum, lub wartość logiczną odczytać do obiektów, w zależności od tego, czy obiekty są przechowywane w archiwum lub źródło archiwum.Zastąpić SerializeElements Jeśli ta akcja nie jest właściwe.
Jeśli Twojej kolekcji są przechowywane obiekty pochodzące z CObject i użyć IMPLEMENT_SERIAL makro w implementacji klasy elementów kolekcji można korzystać serializacji funkcji wbudowanych w CArchive i CObject:
CArray< CPerson, CPerson& > personArray;
template <> void AFXAPI SerializeElements <CPerson> (CArchive& ar,
CPerson* pNewPersons, INT_PTR nCount)
{
for (int i = 0; i < nCount; i++, pNewPersons++)
{
// Serialize each CPerson object
pNewPersons->Serialize(ar);
}
}
Wstawiania przeciążone operatory CArchive call CObject::Serialize (lub przesłonięcie tej funkcji) dla każdego CPerson obiektu.
Korzystanie z klas kolekcji Nontemplate
MFC obsługuje również w klasach kolekcji wprowadzone z MFC w wersji 1.0.Klasy te nie są oparte na szablonach.Może służyć do zawierają dane obsługiwane typy CObject*, UINT, DWORD, i CString.Można użyć tych wstępnie zdefiniowanych kolekcji (takie jak CObList) do przechowywania kolekcji wszelkie obiekty pochodzące z CObject.MFC zapewnia również zawierające inne kolekcje wstępnie zdefiniowane do przechowywania typów pierwotnych, takich jak UINT i unieważnić wskaźniki (void*).Ogólnie rzecz biorąc jednak warto często zdefiniować własne kolekcje typ palety do przechowywania obiektów klasy bardziej szczegółowych i jego pochodne.Należy zauważyć, że w ten sposób w klasach kolekcji nie oparte na szablonach jest więcej pracy, niż korzystanie z klas opartych na szablonie.
Istnieją dwa sposoby tworzenia kolekcji typu palety z kolekcji nontemplate:
Za pomocą kolekcji nontemplate typu oddał w razie potrzeby.Jest to łatwiejsze podejście.
Pochodzić od i rozszerzać nontemplate Kolekcja typ palety.
Do kolekcji nontemplate za pomocą typu rzutowania
Użyj jednej z klas nontemplate, takich jak CWordArray, bezpośrednio.
Na przykład, można utworzyć CWordArray i dodać do niej wszystkie wartości 32-bitowe, a następnie je pobierać.Nie ma nic więcej do zrobienia.Wystarczy użyć wstępnie zdefiniowane funkcje.
Umożliwia także wstępnie zdefiniowaną kolekcją, takich jak CObList, aby pomieścić wszystkie obiekty pochodzące z CObject.A CObList kolekcji jest zdefiniowana do przechowywania wskaźniki do CObject.Podczas pobierania obiektu z listy, może zajść potrzeba oddania wynik odpowiedniego typu od CObList funkcje zwracają wskaźniki do CObject.Na przykład, jeśli są przechowywane CPerson obiektów w CObList kolekcji, masz do oddania pobrane element za wskaźnik do CPerson obiektu.W poniższym przykładzie użyto CObList kolekcji trzymać CPerson obiektów:
CPerson* p1 = new CPerson(); CObList myList; myList.AddHead(p1); // No cast needed CPerson* p2 = (CPerson*)myList.GetHead();
Ta technika przy użyciu typu kolekcji wstępnie zdefiniowanych i oddał w razie potrzeby mogą być odpowiednie dla wielu Twoich potrzeb kolekcji.Jeśli potrzebujesz dalszych funkcjonalności lub więcej bezpieczeństwa typu użyć klasy oparty na szablonie lub należy wykonać następną procedurę.
Do uzyskania i rozszerzyć Kolekcja typ palety nontemplate
Klasy zbioru pochodzi od jednej z klas wstępnie zdefiniowanych nontemplate.
Gdy pochodzi z klasy, można dodać funkcje otoka typu palety zapewnia interfejs typu palety do istniejących funkcji.
Na przykład, jeśli utworzony na liście z CObList do przechowywania CPerson obiektów, można dodać funkcje otoki AddHeadPerson i GetHeadPerson, jak pokazano poniżej.
class CPersonList : public CObList { public: void AddHeadPerson( CPerson* person ) {AddHead( person );} const CPerson* GetHeadPerson() {return (CPerson*)GetHead();} };
Te funkcje otoki umożliwiają typ palety dodać i pobrać CPerson obiektów z listy pochodnej.Widać, że w przypadku GetHeadPerson funkcji, są po prostu encapsulating typu rzutowania.
Można również dodać nowe funkcje przez definiowanie nowych funkcji, które rozszerzają możliwości zbierania, a nie po prostu zawinięciem istniejące funkcje otoki typ palety.Na przykład artykuł Usuwanie wszystkich obiektów w kolekcji CObject w tym artykule opisano funkcję, aby usunąć wszystkie obiekty zawarte na liście.Tę funkcję można dodać do klasy pochodnej jako funkcji składowej.