Comment : Effectuez une collection de type sécurisé

Cet article explique comment créer des collections de type sécurisé pour vos propres types de données.Les rubriques traitées ici sont les suivantes :

  • À l'aide de les classes basées sur des modèles pour la sécurité de type

  • Implémenter des fonctions d'assistance

  • À l'aide de les classes de collection non basées sur des modèles

La bibliothèque MFC fournit des collections de type sécurisé prédéfinies sur des modèles C++.Puisqu'ils sont des modèles, l'utilisation de ces classes fournissent la sécurité de type et la facilité d'utilisation sans stéréotype et un autre travail supplémentaire relatifs à l'aide d'une classe non basée sur un modèle à cet effet.L'exemple COLLECT MFC illustre l'utilisation des classes de collection basées sur des modèles dans une application MFC.Utilisez communément ces classes lorsque vous écrivez du nouveau code de collections.

À l'aide de les classes basées sur des modèles pour la sécurité de type

Pour utiliser les classes basées sur des modèles

  1. Déclarez une variable du type de classe de collection.Par exemple :

    CList<int, int> m_intList;
    
  2. Appelez les fonctions membres de l'objet collection.Par exemple :

    m_intList.AddTail(100);
    m_intList.RemoveAll();
    
  3. Si nécessaire, implémentez fonctions d'assistance et SerializeElements.Pour plus d'informations sur implémenter ces fonctionnalités, consultez l' 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 de la liste.Le deuxième paramètre spécifie la manière dont les données doivent être passée et retournée les fonctions membres de la classe de collection, telles que Ajouter et GetAt.

Implémenter des fonctions d'assistance

Les classes de collection basées sur des modèles CArray, CList, et fonctions d'assistance globales de l'utilisation cinq d' CMap que vous pouvez personnaliser en fonction de les besoins de 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 MFC Reference.L'implémentation de la fonction de sérialisation est nécessaire pour la plupart des fonctionnalités des classes de collection basées sur des modèles.

6s70zdb8.collapse_all(fr-fr,VS.110).gifLa sérialisation des éléments

CArray, CList, et les classes d' CMap appellent SerializeElements pour stocker des éléments de collection à ou pour lire d'une archive.

L'implémentation par défaut de la fonction d'assistance d' SerializeElements fait l'écriture de bits des objets à l'archive, ou une lecture de bits de l'archive aux objets, selon que les objets sont stockées dans ou récupérées de l'archive.Substituez SerializeElements si cette action n'est pas appropriée.

Si votre collection stocke les objets dérivés d' CObject et utilisez la macro d' IMPLEMENT_SERIAL dans l'implémentation de la classe d'éléments de la 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 d'insertion surchargés pour CArchive appellent CObject::Serialize (ou une substitution de cette fonction) pour chaque objet de CPerson .

À l'aide de les classes de collection non basées sur des modèles

MFC prend en charge également des classes de collections introduites dans la version 1,0 de MFC.Ces classes ne sont pas sur des modèles.Ils peuvent être utilisés pour contenir les données des types pris en charge CObject*, UINT, DWORD, et CString.Vous pouvez utiliser ces collections prédéfinies (telles qu' CObList) pour y stocker les collections de tous les objets dérivées d' CObject.MFC fournit également d'autres collections intégrées pour contenir des types primitifs tels qu' UINT et des pointeurs void (void*).En général toutefois, il est souvent utile de définir vos propres collections de type sécurisé pour conserver des objets d'une classe plus spécifique et ses dérivés.Notez que fait avec les classes de collection pas sur des modèles est plus de travail que l'utilisation des classes basées sur des modèles.

Il existe deux façons de créer des collections de type sécurisé avec les collections non basées sur des modèles :

  1. Utilisez les collections non basées sur des modèles, avec le type cast si nécessaire.Cette approche est plus facile.

  2. Dérivez de et étendre une collection de type sécurisé non basée sur un modèle.

Pour utiliser les collections non basées sur des modèles avec le cast de type

  • Utilisez l'une des classes non basées sur des modèles, telles que CWordArray, directement.

    Par exemple, vous pouvez créer CWordArray et ajouter toutes les valeurs de 32 bits à lui, les extraire.Vous n'avez rien d'autre que.Vous utilisez uniquement les fonctionnalités intégrées.

    Vous pouvez également utiliser une collection prédéfinie, telle qu' CObList, pour y stocker tous les objets dérivés d' CObject.Une collection d' CObList est définie pour contenir des pointeurs vers CObject.Lorsque vous récupérez un objet de la liste, vous deviez effectuer le résultat au type approprié comme les fonctions d' CObList retournent des pointeurs vers CObject.Par exemple, si vous stockez les objets d' CPerson dans une collection d' CObList , vous devez effectuer un cast d'un élément récupéré pour être un pointeur vers un objet d' CPerson .L'exemple suivant utilise une collection d' CObList pour conserver des objets d' CPerson :

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

    Cette technique d'utiliser un type de collection intégré et du cast requis peut s'avérer suffisante pour plusieurs de vos besoins de collection.Si vous avez besoin plus de fonctionnalités ou de plus de sécurité de type, utilisez une classe basée sur un modèle, ou suivez la procédure suivante.

Pour dériver et étendre une collection de type sécurisé non basée sur un modèle

  • Dérivez votre propre classe de collection de l'une des classes non basées sur des schémas 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é à les fonctions existantes.

    Par exemple, si vous dérivé une liste d' CObList pour conserver des objets d' CPerson , vous pouvez ajouter les 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 offrent un moyen sûr d'ajouter et de récupérer des objets d' CPerson de la liste dérivée.Vous pouvez voir que pour la fonction d' GetHeadPerson , vous encapsulez simplement le cast de type.

    Vous pouvez également ajouter la nouvelle fonction en définissant les nouvelles fonctions qui étendent les fonctions de la collection au lieu de simplement encapsulant les fonctionnalités existantes dans wrappers de type sécurisé.Par exemple, l'élément supprimer tous les objets dans une collection de CObject décrit une fonction pour supprimer tous les objets contenus dans une liste.Cette fonction peut être ajoutée à la classe dérivée comme fonction membre.

Voir aussi

Concepts

Collections