Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article explique les classes de collection basées sur un modèle de type sécurisé dans MFC version 3.0 et ultérieures. L’utilisation de ces modèles pour créer des regroupements de type sécurisé est plus pratique et permet de fournir une sécurité de type plus efficace que l’utilisation des classes de collection non basées sur des modèles.
MFC prédéfini deux catégories de collections basées sur des modèles :
Classes de tableau, de liste et de mappage simples
CArray, ,CListCMapTableaux, listes et mappages de pointeurs typés
CTypedPtrArray, ,CTypedPtrListCTypedPtrMap
Les classes de collection simples sont toutes dérivées de la classe CObject. Elles héritent donc de la sérialisation, de la création dynamique et d’autres propriétés de CObject. Les classes de collection de pointeurs typées nécessitent que vous spécifiiez la classe à partir de laquelle vous dérivez , qui doit être l’une des collections de pointeurs nontemplate prédéfinies par MFC, telles que CPtrList ou CPtrArray. Votre nouvelle classe de collection hérite de la classe de base spécifiée, et les fonctions membres de la nouvelle classe utilisent des appels encapsulés aux membres de classe de base pour appliquer la sécurité de type.
Pour plus d’informations sur les modèles C++, consultez Modèles dans la référence du langage C++.
Utilisation de modèles de tableau, de liste et de mappage simples
Pour utiliser les modèles de collection simples, vous devez connaître le type de données que vous pouvez stocker dans ces collections et les paramètres à utiliser dans vos déclarations de collection.
Utilisation simple du tableau et de la liste
Les classes de tableau et de liste simples, CArray et CList, prennent deux paramètres : TYPE et ARG_TYPE. Ces classes peuvent stocker n’importe quel type de données, que vous spécifiez dans le paramètre TYPE :
Types de données C++ fondamentaux, tels que
int,charetfloatStructures et classes C++
Autres types que vous définissez
Pour des raisons pratiques et efficaces, vous pouvez utiliser le paramètre ARG_TYPE pour spécifier le type d’arguments de fonction. En règle générale, vous spécifiez ARG_TYPE comme référence au type que vous avez nommé dans le paramètre TYPE . Par exemple:
CArray<int, int> myArray;
CList<CPerson, CPerson &> myList;
Le premier exemple déclare une collection de tableaux, myArrayqui contient **int**s. Le deuxième exemple déclare une collection de listes, myListqui stocke les CPerson objets. Certaines fonctions membres des classes de collection prennent des arguments dont le type est spécifié par le paramètre de modèle ARG_TYPE . Par exemple, la Add fonction membre de la classe CArray prend un argument ARG_TYPE :
CArray<CPerson, CPerson &> personArr;
CPerson person;
personArr.Add(person);
Utilisation simple de la carte
La classe de mappage simple, CMap, prend quatre paramètres : KEY, ARG_KEY, VALUE et ARG_VALUE. Comme les classes de tableau et de liste, les classes de mappage peuvent stocker n’importe quel type de données. Contrairement aux tableaux et listes, qui indexent et trient les données qu’ils stockent, mappe associent des clés et des valeurs : vous accédez à une valeur stockée dans une carte en spécifiant la clé associée de la valeur. Le paramètre KEY spécifie le type de données des clés utilisées pour accéder aux données stockées dans la carte. Si le type de KEY est une structure ou une classe, le paramètre ARG_KEY est généralement une référence au type spécifié dans KEY. Le paramètre VALUE spécifie le type des éléments stockés dans la carte. Si le type de ARG_VALUE est une structure ou une classe, le paramètre ARG_VALUE est généralement une référence au type spécifié dans VALUE. Par exemple:
CMap<int, int, MY_STRUCT, MY_STRUCT &> myMap1;
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap2;
Le premier exemple stocke les MY_STRUCT valeurs, les accède par int clés et retourne les éléments accessibles MY_STRUCT par référence. Le deuxième exemple stocke les CPerson valeurs, les accède par CString clés et retourne des références aux éléments accessibles. Cet exemple peut représenter un carnet d’adresses simple, dans lequel vous recherchez des personnes par nom.
Étant donné que le paramètre KEY est de type CString et que le paramètre KEY_TYPE est de type LPCSTR, les clés sont stockées dans la carte en tant qu’éléments de type CString , mais sont référencées dans des fonctions telles que SetAt des pointeurs de type LPCSTR. Par exemple:
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);
Utilisation de modèles de collection Typed-Pointer
Pour utiliser les modèles de collection de pointeurs typés, vous devez connaître les types de données que vous pouvez stocker dans ces collections et les paramètres à utiliser dans vos déclarations de collection.
Typed-Pointer Tableau et Utilisation de liste
Le tableau de pointeurs typé et les classes de liste, CTypedPtrArray et CTypedPtrList, prennent deux paramètres : BASE_CLASS et TYPE. Ces classes peuvent stocker n’importe quel type de données, que vous spécifiez dans le paramètre TYPE . Ils sont dérivés de l’une des classes de collection nontemplate qui stocke les pointeurs ; vous spécifiez cette classe de base dans BASE_CLASS. Pour les tableaux, utilisez l’une ou l’autre CObArray .CPtrArray Pour les listes, utilisez l’une ou l’autre CObList .CPtrList
En effet, lorsque vous déclarez une collection basée sur, par exemple CObList, la nouvelle classe hérite non seulement des membres de sa classe de base, mais elle déclare également un certain nombre de fonctions et opérateurs de membre de type sécurisé supplémentaires qui aident à assurer la sécurité du type en encapsulant les appels aux membres de la classe de base. Ces encapsulations gèrent toutes les conversions de type nécessaires. Par exemple:
CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;
Le premier exemple déclare un tableau de pointeurs typés, myArraydérivé de CObArray. Le tableau stocke et retourne des pointeurs vers CPerson des objets (où CPerson est une classe dérivée de CObject). Vous pouvez appeler n’importe quelle CObArray fonction membre, ou appeler la nouvelle fonction de type-safe GetAt et ElementAt les fonctions ou utiliser l’opérateur type-safe [ ] .
Le deuxième exemple déclare une liste de pointeurs typés, myListdérivée de CPtrList. La liste stocke et retourne des pointeurs vers MY_STRUCT des objets. Une classe basée sur CPtrList est utilisée pour stocker des pointeurs vers des objets non dérivés de CObject.
CTypedPtrLista un certain nombre de fonctions membres de type sécurisé : GetHead, , RemoveHeadGetTail, RemoveTail, GetNext, , GetPrev, et GetAt.
Typed-Pointer Mapper l’utilisation
La classe map de pointeur typé, CTypedPtrMap, prend trois paramètres : BASE_CLASS, KEY et VALUE. Le paramètre BASE_CLASS spécifie la classe à partir de laquelle dériver la nouvelle classe : CMapPtrToWord, , CMapPtrToPtr, CMapStringToPtrCMapWordToPtr, , CMapStringToOb, et ainsi de suite.
KEY est analogue à KEY in CMap: il spécifie le type de la clé utilisée pour les recherches.
VALUE est analogue à VALUE dans CMap: il spécifie le type d’objet stocké dans la carte. Par exemple:
CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;
Le premier exemple est une carte basée sur CMapPtrToPtr : elle utilise CString des clés mappées aux pointeurs vers MY_STRUCT. Vous pouvez rechercher un pointeur stocké en appelant une fonction membre de type sécurisé Lookup . Vous pouvez utiliser l’opérateur [ ] pour rechercher un pointeur stocké et l’ajouter s’il est introuvable. Vous pouvez également itérer la carte à l’aide de la fonction type-safe GetNextAssoc . Vous pouvez également appeler d’autres fonctions membres de la classe CMapPtrToPtr.
Le deuxième exemple est une carte basée sur CMapStringToOb : elle utilise des clés de chaîne mappées pour les pointeurs stockés vers CMyObject des objets. Vous pouvez utiliser les mêmes membres de type sécurisé décrits dans le paragraphe précédent, ou appeler des membres de la classe CMapStringToOb.
Remarque
Si vous spécifiez un ou struct un class type pour le paramètre VALUE, plutôt qu’un pointeur ou une référence au type, la classe ou la structure doit avoir un constructeur de copie.
Pour plus d’informations, consultez How to Make a Type-Safe Collection.