Udostępnij za pośrednictwem


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

  1. Zadeklaruj zmienną typu klasy kolekcji.Na przykład:

    CList<int, int> m_intList;
    
  2. Wywołanie członka funkcje obiektu kolekcji.Na przykład:

    m_intList.AddTail(100);
    m_intList.RemoveAll();
    
  3. 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.

6s70zdb8.collapse_all(pl-pl,VS.110).gifSerializacja 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:

  1. Użyć kolekcji nontemplate rzutowanie typu, jeśli jest to konieczne.Jest to podejście łatwiejsze.

  2. 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.

Zobacz też

Koncepcje

Kolekcje