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

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

    CList<int, int> m_intList;
    
  2. Należy wywołać element członkowski funkcje obiektu kolekcji.Na przykład:

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

  1. Za pomocą kolekcji nontemplate typu oddał w razie potrzeby.Jest to łatwiejsze podejście.

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

Zobacz też

Koncepcje

Kolekcje