Comment : faites une collection de type sécurisé
Cet article explique comment effectuer les collections de type sécurisé pour vos propres types de données. Les rubriques traitées ici sont les suivantes :
Utilisation des classes sur TEMPLATE pour la cohérence des types
Implémentation des fonctions d'assistance
Utilisation des classes des collections non typées
La bibliothèque MFC fournit les collections de type sécurisé prédéfinies basées sur des modèles C++. Étant donné qu'ils sont des modèles, l'utilisation de ces classes fournissent la cohérence des types et simplifier l'utilisation sans stéréotype et un autre travail supplémentaire impliquées lors de l'utilisation d'une classe basée sur des modèles à cet effet. L'exemple Classe d'événements RECUEILLEZ de MFC illustre l'utilisation de classes de collection TEMPLATE de dans une application de MFC. Utilisez en général ces classes lorsque vous entrez un nouveau code de collections.
Utilisation des classes sur TEMPLATE pour la cohérence des types
Pour utiliser les classes sur TEMPLATE
Déclarez une variable du type stocké dans la collection. Par exemple :
CList<int, int> m_intList;
Appelez la fonction membre de l'objet de la collection. Par exemple :
m_intList.AddTail(100); m_intList.RemoveAll();
Si nécessaire, mettez en œuvre fonctions d'assistance et SerializeElements. Pour plus d'informations sur l'implémentation de ces fonctions, consultez Implémenter des fonctions d'assistance.
Cet exemple illustre la déclaration d'une liste d'entiers. Le premier paramètre à l'étape 1 est le type de données stockées en tant qu'éléments dans la liste. Le deuxième paramètre spécifie comment les données doivent être passée et retournée les fonctions membres de la classe de collection, telles que Ajouter et GetAt.
Implémentation des fonctions d'assistance
Les classes de collection de CArrayTEMPLATE, CList, et cinq fonctions d'assistance globales d'utilisation CMap que vous pouvez personnaliser autant que nécessaire pour votre classe de collection dérivée. Pour plus d'informations sur ces fonctions d'assistance, consultez Programmes d'assistance de classe de collection dans le guide de MFC. L'implémentation de la fonction de sérialisation est nécessaire pour la plupart des utilisations de classes de la collection sur template.
Sérialiser des éléments
Les classes CArray, CList, et CMap appellent SerializeElements pour stocker des éléments de collecte ou pour la lecture d'une archive.
L'implémentation par défaut de la fonction d'assistance de SerializeElements effectue une écriture de bits des objets à l'archive, ou une lecture au niveau de l'archivage des objets, selon que les objets sont stockées dans ou extraites de l'archivage. Remplacez SerializeElements si cette opération n'est pas appropriée.
Si la collection contient des objets dérivés CObject et vous utilisez la macro IMPLEMENT_SERIAL dans l'implémentation de la classe d'éléments de collection, vous pouvez tirer parti des fonctionnalités de sérialisation intégrée à CArchive et 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);
}
}
Les opérateurs surchargés d'insertion pour CArchive appellent CObject::Serialize (ou une substitution de cette fonction) pour chaque objet de CPerson.
Utilisation des classes des collections non typées
MFC gère également des classes de collection introduites avec la version 1,0 de MFC. Ces classes ne sont pas fondées sur les classes ODBC MFC. Elles peuvent être utilisées pour contenir les données des types pris en charge CObject*, UINT, DWORD, et CString. Vous pouvez utiliser ces collections prédéfinies (comme CObList) pour gérer des collections de tous les objets dérivés de CObject. MFC permet également d'autres collections prédéfinies pour gérer des types primitifs tels que UINT et des pointeurs voidsvoid(*). En général toutefois, il est souvent pratique de définir vos propres collections de type sécurisé pour stocker des objets de plusieurs classe spécifique et ses dérivée. Notez que fait à l'aide de classes de collection pas basées sur des modèles comprend plus de travail d'utiliser les classes TEMPLATE sur.
Il existe deux manières de créer des collections de type sécurisé avec les collections basées sur les modèles :
Utilisez des collections basées sur les modèles, le type de la conversion si nécessaire. Il s'agit de l'approche plus facile.
Dériver de et étendez collection de type sécurisé basée sur des modèles.
Pour utiliser des collections basées sur les modèles avec la conversion de type
Utilisez l'une des classes basées sur des modèles, telles que CWordArray.
Par exemple, vous pouvez créer CWordArray et ajouter toutes les valeurs 32 bits à lui, les récupérer. Il n'existe aucune autre à effectuer. Vous utilisez uniquement la fonctionnalité prédéfinie.
Vous pouvez également utiliser une collection prédéfinies, par exemple CObList, pour conserver tous les objets dérivés CObject. Une collection CObList est définie pour contenir les pointeurs vers CObject. Lorsque vous récupérez un objet dans la liste, vous devrez peut-être convertir le résultat en type approprié les fonctions CObList retournent des pointeurs vers CObject. Par exemple, si vous stockez des objets CPerson dans une collection CObList, vous devez convertir un élément récupéré pour être un pointeur vers un objet CPerson. L'exemple suivant utilise une collection CObList pour gérer les objets CPerson :
CPerson* p1 = new CPerson(); CObList myList; myList.AddHead(p1); // No cast needed CPerson* p2 = (CPerson*)myList.GetHead();
Cette technique d'un type de collecte prédéfini et de conversion nécessaire peut être adéquate pour plusieurs de vos besoins à la collection. Si vous avez plus besoin de fonctionnalités ou plus de la cohérence des types, utilisez une classe basée TEMPLATE, ou suivez la procédure suivante.
Faire dériver de et étendez collection de type sécurisé basée sur des modèles.
Dériver votre propre classe de collection de l'une des classes basées sur des modèles prédéfinis.
Lorsque vous dérivez votre classe, vous pouvez ajouter des fonctions wrapper de type sécurisé pour fournir une interface de type sécurisé à des fonctions.
Par exemple, si vous dériviez une liste CObList pour gérer les objets CPerson, vous pouvez ajouter des fonctions wrapper AddHeadPerson et GetHeadPerson, comme indiqué ci-dessous.
class CPersonList : public CObList { public: void AddHeadPerson( CPerson* person ) {AddHead( person );} const CPerson* GetHeadPerson() {return (CPerson*)GetHead();} };
Ces fonctions wrapper permettent une manière sécurisée d'ajouter et de récupérer des objets de CPerson de la liste dérivée. Vous pouvez voir que de la fonction GetHeadPerson, vous encapsulez simplement la conversion de type.
Vous pouvez également ajouter une nouvelle fonctionnalité en définissant les nouvelles fonctionnalités qui étendent les fonctionnalités de la collection plutôt que juste encapsulant les fonctionnalités existantes de wrapper de type sécurisé. Par exemple, l'article Supprimer tous les objets dans une collection de CObject décrit la fonction pour supprimer tous les objets contenus dans une liste. Cette fonction peut être ajoutée à cette classe dérivée comme une fonction membre.