Postupy: Příprava typově bezpečné kolekce
Tento článek vysvětluje, jak provést bezpečné typ kolekce pro vlastní datové typy.Témata zahrnují:
Pomocí třídy založené na šablonách pro bezpečnost typů
Provádění podpůrné funkce
Pomocí kolekce tříd nontemplate
Knihovny Microsoft Foundation Class poskytuje předdefinované kolekce zajišťující bezpečnost typů podle šablony jazyka C++.Vzhledem k tomu, že jsou šablony, tyto třídy poskytují typovou bezpečnost a snadné použití bez přetypování typů a další práce navíc při použití třídy nontemplate k tomuto účelu.Vzorek knihovny MFC sběr znázorňuje použití třídy kolekcí na základě šablony v aplikaci knihovny MFC.Obecně použití těchto tříd, když píšete kód nové kolekce.
Pomocí třídy založené na šablonách pro bezpečnost typů
Chcete-li použít třídy založené na předloze
Deklarování proměnné typu třídy kolekce.Příklad:
CList<int, int> m_intList;
Zavolejte členské funkce objektu kolekce.Příklad:
m_intList.AddTail(100); m_intList.RemoveAll();
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í podpůrné funkce.
Tento příklad ukazuje deklaraci seznamu celých čísel.První parametr v kroku 1 je typ dat uložených jako prvky v seznamu.Druhý parametr určuje, jak data předána a vrátil členské funkce třídy kolekce, jako například Přidat a GetAt.
Provádění podpůrné funkce
Třídy kolekcí založený na šabloně CArray, CList, a CMap pomocí pěti globální podporu funkcí, které lze upravit podle potřeb třídy odvozené kolekce.Informace o těchto funkcích pomocníka v Kolekce třídy pomocníky v Odkaz knihovny MFC.Provádění funkce serializace je nezbytné pro většinu použití třídy kolekce založené na šablonách.
Serializace prvky
CArray, CList, A CMap třídy volání SerializeElements prvky kolekce uložit nebo číst je z archivu.
Výchozí implementace SerializeElements podpůrná funkce neobsahuje bitové operace zápisu z objektů do archivu, nebo logické bitové čtení z archivu na objekty, v závislosti na tom, zda objekty jsou skladovány v nebo načteny z archivu.Přepsat SerializeElements -li tuto akci není vhodné.
Pokud obsahuje kolekci objektů odvozených z třídy CObject a IMPLEMENT_SERIAL makro v implementaci třídy prvků kolekce, můžete využít funkce serializace vestavěnou 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 volat CObject::Serialize (nebo přepsání funkce) pro každý CPerson objektu.
Pomocí kolekce tříd Nontemplate
MFC podporuje také třídy kolekcí zavedené s knihovnou MFC verze 1.0.Tyto třídy nejsou založeny na šablonách.Použitím obsahovat data z podporovaných typů CObject*, UINT, DWORD, a CString.Můžete použít tyto předdefinované kolekce (například CObList) pro libovolný objekt odvozené z kolekce CObject.Knihovna MFC poskytuje také další předdefinované skupiny pro primitivní typy, jako UINT a zrušit ukazatelů (void*).Obecně však je často užitečné, chcete-li definovat vlastní bezpečnost typů kolekce držet objekty zvláštní třídy a jeho deriváty.Všimněte si, že to s kolekcí tříd není založené na šablonách více práce, než použití tříd založených na šabloně.
Existují dva způsoby vytvoření bezpečného typu kolekce pomocí kolekce nontemplate:
Pomocí kolekce nontemplate obsazení typ, pokud je to nutné.Jedná se o jednodušší postup.
Odvozovat a rozšířit kolekci nontemplate zajišťující bezpečnost typů.
Pomocí přetypování typů kolekce nontemplate
Použijte jednu ze tříd nontemplate, jako CWordArray, přímo.
Například můžete vytvořit CWordArray a přidejte do něj všechny 32bitové hodnoty a potom je znovu načíst.Není nic dalšího provést.Právě pomocí předdefinované funkce.
Můžete také použít předdefinovanou kolekci, jako CObList, držet všechny objekty odvozené z CObject.A CObList je definována kolekce pro uložení ukazatele na CObject.Při načítání objektu ze seznamu, bude pravděpodobně nutné výsledek přetypovat na správný typ. od CObList funkce vrátí odkazy na CObject.Uložíte-li například CPerson objekty v CObList kolekce, je nutné prvek načtený jako ukazatel přetypovat 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();
Tuto techniku pomocí předdefinované kolekce typu a obsazení v případě potřeby může být dostačující pro většinu potřeb kolekce.Pokud potřebujete další funkce nebo další typové bezpečnosti, použijte třídu založenou na šabloně nebo další postup.
Chcete-li odvodit a rozšířit kolekci nontemplate zajišťující bezpečnost typů
Třídy vlastní kolekce odvodíte z jedné ze tříd předdefinovaných nontemplate.
Při odvození třídy můžete přidat funkce obálky zajišťující bezpečnost typů poskytují rozhraní ke stávající funkce zajišťující bezpečnost typů.
Například, pokud je odvozen ze seznamu CObList držet CPerson objekty, můžete přidat funkce obálky AddHeadPerson a GetHeadPerson, jak je ukázáno níže.
class CPersonList : public CObList { public: void AddHeadPerson( CPerson* person ) {AddHead( person );} const CPerson* GetHeadPerson() {return (CPerson*)GetHead();} };
Tyto funkce obálky poskytuje bezpečný způsob, jak přidat a získat CPerson ze seznamu odvozené objekty.Uvidíte, že pro GetHeadPerson funkce jsou jednoduše zapouzdřením přetypování typů.
Definování nových funkcí, které rozšiřují možnosti sběru, spíše než do obálky zajišťující bezpečnost typů pouze obtékání existující funkce můžete také přidat nové funkce.Například v článku Odstranění všech objektů v kolekci třídy CObject popisuje funkci, kterou chcete odstranit všechny objekty obsažené v seznamu.Tuto funkci nelze přidat odvozené třídy jako členské funkce.