Sdílet prostřednictvím


Jak: vytvoření bezpečné typ kolekce

Tento článek vysvětluje, jak provést bezpečné typ kolekce pro vlastní datové typy.Témata zahrnují:

  • Pomocí tříd, založený na šabloně pro typ bezpečnosti

  • Provádění pomocné funkce

  • Pomocí třídy nontemplate kolekce

Knihovny Microsoft Foundation Class poskytuje předdefinované bezpečné typ kolekce na základě šablony jazyka C++.Protože jsou šablony tyto třídy zajišťuje bezpečnost typů a snadnost používání bez typu obsazení a další práci podílejí pomocí třídy nontemplate pro tento účel.MFC vzorku SHROMÁŽDĚNÍ znázorňuje použití třídy kolekce založené na předloze aplikace MFC.Tyto třídy obecně používejte při každém zápisu kódu nové kolekce.

Pomocí tříd, založený na šabloně pro typ bezpečnosti

Použití tříd založených na šabloně

  1. Deklarujte proměnnou typu kolekce třídy.Příklad:

    CList<int, int> m_intList;
    
  2. Volejte členské funkce objektu kolekce.Příklad:

    m_intList.AddTail(100);
    m_intList.RemoveAll();
    
  3. V případě potřeby provádět pomocné funkce a SerializeElements.Informace o implementaci těchto funkcí naleznete v tématu Provádění pomocné funkce.

Tento příklad ukazuje prohlášení seznamu celých čísel.V kroku 1 první parametr je typu dat uložených jako prvky seznamu.Druhý parametr určuje, jak se data předána a vrátil z funkce členů třídy kolekce jako Přidat a GetAt.

Provádění pomocné funkce

Kolekce založené na šablonách třídy CArray, CList, a CMap pomocí pěti globální pomocné funkce, které můžete upravit podle potřeby vaší kolekce odvozené třídy.Informace o těchto funkcích pomocníka Pomocníky třídy kolekce v MFC odkaz.Provádění funkce serializace je nezbytné pro většinu použití třídy kolekce založené na šabloně.

6s70zdb8.collapse_all(cs-cz,VS.110).gifPři serializaci prvky

CArray, CList, A CMap volání třídy SerializeElements prvky kolekce ukládat a číst je z archivu.

Výchozí implementace SerializeElements pomocné funkce neobsahuje bitové operace zápisu z objektů do archivu nebo bitové na objekty v závislosti na tom, zda objekty jsou skladovány na čtení z archivu nebo načíst z archivu.Přepsat SerializeElements Pokud není tato akce.

Pokud kolekce objektů, které jsou odvozeny z CObject a použít IMPLEMENT_SERIAL makro v implementaci třídy prvek kolekce můžete využít funkce serializace do CArchive a 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);
   }
}

Vložení přetížené operátory pro CArchive volání CObject::Serialize (nebo lokálními funkce) pro každou CPerson objektu.

Pomocí třídy Nontemplate kolekce

MFC podporuje také kolekce tříd představen MFC verze 1.0.Tyto třídy nejsou založeny na šablonách.Lze použít obsahovat data z podporovaných typů CObject*, UINT, DWORD, a CString.Můžete použít tyto předdefinované skupiny (například CObList) pro uložení všech objektů z kolekce CObject.MFC poskytuje také jiné předdefinované skupiny držet primitivními typy jako UINT a zrušit ukazatele (void*).Obecně je však často užitečné definovat vlastní kolekce typ bezpečné pro uložení objektů konkrétní třídy a jeho deriváty.Všimněte si, že není tím s třídami kolekce založené na šablonách více práce, než použití tříd založených na šabloně.

Vytvořit bezpečné typ kolekce kolekce nontemplate s dvěma způsoby:

  1. Pomocí typu obsazení potřeby kolekce nontemplate.Toto je snadnější přístup.

  2. Pocházet z a rozšířit bezpečné typ kolekce nontemplate.

Pomocí obsazení typ kolekce nontemplate

  • Použijte jeden z třídy nontemplate jako CWordArray, přímo.

    Můžete například vytvořit CWordArray a do ní přidat všechny 32bitové hodnoty a potom je znovu načíst.Není nic dalšího provést.Stačí použít předdefinované funkce.

    Předdefinované kolekce můžete použít také jako CObList, držet všechny objekty z CObject.A CObList kolekce je definována pro ukazatele na CObject.Při načítání objektu ze seznamu pravděpodobně přetypovat výsledek od správného typu CObList funkce vrátí odkazy na CObject.Uložíte-li například CPerson objekty v CObList kolekce, máte přetypovat načtený prvek se ukazatel na CPerson objektu.V následujícím příkladu CObList kolekce držet CPerson objekty:

    CPerson* p1 = new CPerson();
    CObList myList;
    
    myList.AddHead(p1);   // No cast needed
    CPerson* p2 = (CPerson*)myList.GetHead();
    

    Tato technika pomocí předdefinovaných kolekce typu a obsazení podle potřeby může být dostačující pro většinu potřeb kolekce.Pokud potřebujete další funkce nebo další typ bezpečnosti, použijte třídu šablony nebo další postup.

Odvození a rozšířit bezpečné typ kolekce nontemplate

  • Odvození třídy vlastní kolekce z jednoho nontemplate předdefinovaných tříd.

    Při nezískávají své třídy můžete přidat funkce typu bezpečné wrapper poskytovat bezpečné typ rozhraní pro existující funkce.

    Například odvozen ze seznamu CObList pro CPerson objekty můžete přidat funkce souhrnného AddHeadPerson a GetHeadPerson, jak je uvedeno níže.

    class CPersonList : public CObList
    {
    public:
        void AddHeadPerson( CPerson* person )
            {AddHead( person );}
    
        const CPerson* GetHeadPerson()
            {return (CPerson*)GetHead();}
    };
    

    Tyto funkce wrapper umožňují bezpečné typu přidat a načíst CPerson ze seznamu odvozené objekty.Uvidíte, že GetHeadPerson funkci, jsou jednoduše zapouzdřením obsazení typu.

    Definování nových funkcí, které rozšiřují funkce kolekce, nikoli pouze existující funkce obtékání v bezpečné typ obálky můžete také přidat nové funkce.Například v článku Odstranění všech objektů v kolekci CObject popisuje funkci Odstranit všechny objekty obsažené v seznamu.Tuto funkci nelze přidat odvozené třídy jako členské funkce.

Viz také

Koncepty

Kolekce