Jak: tworzenie kolekcji typ palety
W tym artykule wyjaśniono, jak dokonać bezpiecznego typu kolekcji dla własne typy danych.Tematy obejmują:
Dla bezpieczeństwa typu przy użyciu klas opartych na szablonie
Funkcje pomocnika wykonawcze
Korzystanie z klas kolekcji nontemplate
Biblioteka klas Microsoft Foundation udostępnia 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 rzutowania typu i inne związane ze stosowaniem klasy nontemplate w tym celu dodatkowej pracy.Próbki MFC zbierania demonstruje użycie klas opartych na szablonie kolekcji w aplikacji MFC.Ogólnie rzecz biorąc korzystając z tych klas każdym razem, gdy nowy kod kolekcje.
Dla bezpieczeństwa typu przy użyciu klas opartych na szablonie
Aby skorzystać z klas opartych na szablonie
Zadeklaruj zmienną typu klasy kolekcji.Na przykład:
CList<int, int> m_intList;
Wywołanie członka funkcje obiektu kolekcji.Na przykład:
m_intList.AddTail(100); m_intList.RemoveAll();
W razie potrzeby wprowadzenia w życie funkcji pomocnika i SerializeElements.Aby uzyskać informacje dotyczące implementowania funkcji, zobacz Realizacji funkcji pomocnika.
Ten przykład przedstawia deklaracji na liście liczb całkowitych.Pierwszy parametr w kroku 1 jest typu danych przechowywanych jako elementy listy.Drugi parametr określa, jak dane są przekazywane i zwrócone przez funkcje składowe klasy kolekcji, takie jak Dodaj i GetAt.
Funkcje pomocnika wykonawcze
Klasy zbioru opartych na szablonie CArray, CList, i CMap za pomocą pięciu funkcji globalnych pomocnika, które można dostosować, w razie potrzeby klasy pochodnej kolekcji.Informacje na temat tych funkcji pomocnika, zobacz Pomocnicy klasy kolekcji w Odniesienia MFC.Dla większości zastosowań klas opartych na szablonie kolekcji jest implementacji funkcji serializacji.
Serializacja elementów
CArray, CList, I CMap klasy wywołanie SerializeElements do przechowywania kolekcji elementów lub odczytać archiwum.
Domyślne wykonania SerializeElements funkcja pomocnicza nie bitowe zapisu obiektów do archiwum lub logiczną odczytu 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 kolekcja przechowuje obiekty pochodzące z CObject i za pomocą 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 wywołania CObject::Serialize (lub przesłonięcie tej funkcji) dla każdego CPerson obiektu.
Korzystanie z klas kolekcji Nontemplate
MFC również obsługuje klasy kolekcji z wersji 1.0 MFC.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 zbiorów (takie jak CObList) do przechowywania kolekcji obiekty pochodzące z CObject.MFC zapewnia także inne kolekcje wstępnie zdefiniowane do przechowywania typów pierwotnych, takich jak UINT oraz void wskaźniki (void*).Ogólnie rzecz biorąc jednak często jest przydatne 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 klasy kolekcji nie oparte na szablonach jest więcej pracy niż korzystanie z klas opartych na szablonie.
Tworzyć kolekcje typ palety z kolekcji nontemplate na dwa sposoby:
Użyć kolekcji nontemplate rzutowanie typu, jeśli jest to konieczne.Jest to podejście łatwiejsze.
Pochodzić od i rozszerzyć kolekcji bezpiecznego typu nontemplate.
Aby użyć kolekcji nontemplate z typ rzutowania
Użyj jednej z klas nontemplate, takie jak CWordArray, bezpośrednio.
Na przykład można utworzyć CWordArray i dodać wszelkie wartości 32-bitowe go, a następnie je odzyskać.Nie ma nic więcej robić.Wystarczy użyć wstępnie zdefiniowane funkcje.
Umożliwia także kolekcję wstępnie zdefiniowanych, 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 mieć do oddania wynik do właściwego typu od CObList , funkcje zwracają wskaźniki do CObject.Na przykład, jeśli przechowywane CPerson obiektów w CObList kolekcji, mają oddać pobrany element za wskaźnik do CPerson obiektu.W poniższym przykładzie użyto CObList kolekcji, aby pomieścić 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 potrzeb kolekcji.Jeśli potrzebujesz dalszej funkcji lub więcej bezpieczeństwa typu, użycie klasy opartych na szablonie lub wykonaj następną procedurę.
I rozszerzyć kolekcji bezpiecznego typu nontemplate
Pochodną klasy kolekcji jednej z klas wstępnie nontemplate.
Podczas opierają się klasy można dodawać funkcje otoka typu bezpiecznej zapewnienie interfejsu typu palety do istniejących funkcji.
Na przykład, jeżeli uzyskane listy z CObList do 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ą bezpieczne typu dodać i pobrać CPerson obiektów z listy pochodnej.Widać, że dla GetHeadPerson funkcji, są po prostu encapsulating rzutowanie typu.
Można również dodać nowe funkcje przez definiowanie nowych funkcji, które rozszerzają możliwości zbierania, a nie tylko zawijania funkcjonalności istniejących w bezpiecznej typ otoki.Na przykład artykuł Usuwanie wszystkich obiektów w kolekcji CObject w tym artykule opisano funkcję, aby usunąć wszystkie obiekty zawarte na liście.Tej funkcji, można dodać do klasy pochodnej jako funkcji składowej.