La classe CList
Prend en charge les listes ordonnées d'objets non uniques accessibles séquentiellement ou par valeur.
Syntaxe
template<class TYPE, class ARG_TYPE = const TYPE&>
class CList : public CObject
Membres
Constructeurs publics
Nom | Description |
---|---|
CList::CList |
Construit une liste ordonnée vide. |
Méthodes publiques
Nom | Description |
---|---|
CList::AddHead |
Ajoute un élément (ou tous les éléments d’une autre liste) à la tête de la liste (fait un nouveau chef). |
CList::AddTail |
Ajoute un élément (ou tous les éléments d’une autre liste) à la fin de la liste (fait une nouvelle queue). |
CList::Find |
Obtient la position d’un élément spécifié par la valeur du pointeur. |
CList::FindIndex |
Obtient la position d’un élément spécifié par un index de base zéro. |
CList::GetAt |
Obtient l’élément à une position donnée. |
CList::GetCount |
Retourne le nombre d’éléments de cette liste. |
CList::GetHead |
Retourne l’élément principal de la liste (ne peut pas être vide). |
CList::GetHeadPosition |
Retourne la position de l’élément principal de la liste. |
CList::GetNext |
Obtient l’élément suivant pour itérer. |
CList::GetPrev |
Obtient l’élément précédent pour l’itération. |
CList::GetSize |
Retourne le nombre d’éléments de cette liste. |
CList::GetTail |
Retourne l’élément tail de la liste (ne peut pas être vide). |
CList::GetTailPosition |
Retourne la position de l’élément de fin de la liste. |
CList::InsertAfter |
Insère un nouvel élément après une position donnée. |
CList::InsertBefore |
Insère un nouvel élément avant une position donnée. |
CList::IsEmpty |
Teste la condition de liste vide (aucun élément). |
CList::RemoveAll |
Supprime tous les éléments de cette liste. |
CList::RemoveAt |
Supprime un élément de cette liste, spécifié par position. |
CList::RemoveHead |
Supprime l’élément de la tête de la liste. |
CList::RemoveTail |
Supprime l’élément de la fin de la liste. |
CList::SetAt |
Définit l’élément à une position donnée. |
Paramètres
TYPE
Type d’objet stocké dans la liste.
ARG_TYPE
Type utilisé pour référencer des objets stockés dans la liste. Il peut s’agir d’une référence.
Notes
CList
les listes se comportent comme des listes doublement liées.
Une variable de type POSITION
est une clé pour la liste. Vous pouvez utiliser une POSITION
variable comme itérateur pour parcourir une liste de manière séquentielle et en tant que signet pour contenir un emplacement. Toutefois, une position n’est pas la même qu’un index.
L’insertion d’élément est très rapide à la tête de la liste, à la queue et à un connu POSITION
. Une recherche séquentielle est nécessaire pour rechercher un élément par valeur ou index. Cette recherche peut être lente si la liste est longue.
Si vous avez besoin d’un vidage d’éléments individuels dans la liste, vous devez définir la profondeur du contexte de vidage sur 1 ou supérieur.
Certaines fonctions membres de cette classe appellent des fonctions d’assistance globales qui doivent être personnalisées pour la plupart des utilisations de la CList
classe. Consultez les helpers de la classe de collection dans la section « Macros et globals ».
Pour plus d’informations sur l’utilisation CList
, consultez l’article Collections.
Exemple
// CList is a template class that takes two template arguments.
// The first argument is type stored internally by the list, the
// second argument is the type used in the arguments for the
// CList methods.
// This code defines a list of ints.
CList<int, int> myIntList;
// This code defines a list of CStrings
CList<CString, CString &> myStringList;
// This code defines a list of MYTYPEs,
// NOTE: MYTYPE could be any struct, class or type definition
CList<MYTYPE, MYTYPE &> myTypeList;
Hiérarchie d'héritage
CList
Spécifications
En-tête : afxtempl.h
CList::AddHead
Ajoute un nouvel élément ou une liste d’éléments à la tête de cette liste.
POSITION AddHead(ARG_TYPE newElement);
void AddHead(CList* pNewList);
Paramètres
ARG_TYPE
Paramètre de modèle qui spécifie le type de l’élément de liste (peut être une référence).
newElement
Nouvel élément.
pNewList
Pointeur vers une autre CList
liste. Les éléments inclus pNewList
seront ajoutés à cette liste.
Valeur de retour
La première version retourne la POSITION
valeur de l’élément nouvellement inséré.
Notes
La liste peut être vide avant l’opération.
Exemple
// Declarations of the variables used in the example
CList<CString, CString &> myList;
CList<CString, CString &> myList2;
// There are two versions of CList::AddHead: one adds a single
// element to the front of the list, the second adds another list
// to the front.
// This adds the string "ABC" to the front of myList.
// myList is a list of CStrings (ie defined as CList<CString,CString&>).
myList.AddHead(CString(_T("ABC")));
// This adds the elements of myList2 to the front of myList.
myList.AddHead(&myList2);
CList::AddTail
Ajoute un nouvel élément ou une liste d’éléments à la fin de cette liste.
POSITION AddTail(ARG_TYPE newElement);
void AddTail(CList* pNewList);
Paramètres
ARG_TYPE
Paramètre de modèle qui spécifie le type de l’élément de liste (peut être une référence).
newElement
Élément à ajouter à cette liste.
pNewList
Pointeur vers une autre CList
liste. Les éléments inclus pNewList
seront ajoutés à cette liste.
Valeur de retour
La première version retourne la POSITION
valeur de l’élément nouvellement inséré.
Notes
La liste peut être vide avant l’opération.
Exemple
// Define myList and myList2.
CList<CString, CString &> myList;
CList<CString, CString &> myList2;
// Add elements to the end of myList and myList2.
myList.AddTail(CString(_T("A")));
myList.AddTail(CString(_T("B")));
myList2.AddTail(CString(_T("C")));
myList2.AddTail(CString(_T("D")));
// There are two versions of CList::AddTail: one adds a single
// element to the end of the list, the second adds another list
// to the end.
// This adds the string "ABC" to the end of myList.
// myList is a list of CStrings (ie defined as CList<CString,CString&>).
myList.AddTail(CString(_T("ABC")));
ASSERT(CString(_T("ABC")) == myList.GetTail());
// This adds the elements of myList2 to the end of myList.
myList.AddTail(&myList2);
CList::CList
Construit une liste ordonnée vide.
CList(INT_PTR nBlockSize = 10);
Paramètres
nBlockSize
Granularité d’allocation de mémoire pour étendre la liste.
Notes
À mesure que la liste augmente, la mémoire est allouée en unités d’entrées nBlockSize
.
Exemple
// This code defines myList as a list of strings
// such that memory gets allocated in chunks of
// 16 strings.
CList<CString, CString &> myList(16);
// This code defines myList2 as a list of ints
// such that memory gets allocated in chunks of
// 128 ints.
CList<int, int> myList2(128);
CList::Find
Recherche séquentiellement la liste pour rechercher le premier élément correspondant à l’élément spécifié searchValue
.
POSITION Find(
ARG_TYPE searchValue,
POSITION startAfter = NULL) const;
Paramètres
ARG_TYPE
Paramètre de modèle qui spécifie le type de l’élément de liste (peut être une référence).
searchValue
Valeur à trouver dans la liste.
startAfter
Position de début de la recherche. Si aucune valeur n’est spécifiée, la recherche commence par l’élément principal.
Valeur de retour
Valeur POSITION
qui peut être utilisée pour l’itération ou la récupération du pointeur d’objet ; NULL
si l’objet est introuvable.
Exemple
// Define myList.
CList<CString, CString &> myList;
// Add three elements to the list.
myList.AddHead(CString(_T("XYZ")));
myList.AddHead(CString(_T("ABC")));
myList.AddHead(CString(_T("123")));
// Find a specific element.
POSITION pos = myList.Find(CString(_T("XYZ")));
ASSERT(CString(_T("XYZ")) == myList.GetAt(pos));
CList::FindIndex
Utilise la valeur d’un nIndex
index dans la liste.
POSITION FindIndex(INT_PTR nIndex) const;
Paramètres
nIndex
Index de base zéro de l’élément de liste à trouver.
Valeur de retour
Valeur POSITION
qui peut être utilisée pour l’itération ou la récupération du pointeur d’objet ; NULL
si nIndex
elle est négative ou trop grande.
Notes
Il démarre une analyse séquentielle à partir de la tête de la liste, en s’arrêtant sur le nièmeélément.
Exemple
// Define myList.
CList<CString, CString &> myList;
// Add three elements to the list.
myList.AddTail(CString(_T("XYZ")));
myList.AddTail(CString(_T("ABC")));
myList.AddTail(CString(_T("123")));
// Verify the first element (index 0).
ASSERT(CString(_T("XYZ")) == myList.GetAt(myList.FindIndex(0)));
// Verify the third element (index 2).
ASSERT(CString(_T("123")) == myList.GetAt(myList.FindIndex(2)));
CList::GetAt
Obtient l’élément de liste à une position donnée.
TYPE& GetAt(POSITION position);
const TYPE& GetAt(POSITION position) const;
Paramètres
TYPE
Paramètre de modèle spécifiant le type d’objet dans la liste.
position
Position dans la liste de l’élément à obtenir.
Valeur de retour
Consultez la description de la valeur de retour pour GetHead
.
Notes
GetAt
retourne l’élément (ou une référence à l’élément) associé à une position donnée. Ce n’est pas le même qu’un index, et vous ne pouvez pas opérer sur une POSITION
valeur vous-même. Une variable de type POSITION
est une clé pour la liste.
Vous devez vous assurer que votre POSITION
valeur représente une position valide dans la liste. S’il n’est pas valide, la version de débogage de la bibliothèque de classes Microsoft Foundation affirme.
Exemple
Consultez l’exemple pour CList::GetHeadPosition
.
CList::GetCount
Obtient le nombre d’éléments de cette liste.
INT_PTR GetCount() const;
Valeur de retour
Valeur entière contenant le nombre d’éléments.
Notes
L’appel de cette méthode génère le même résultat que la CList::GetSize
méthode.
Exemple
Consultez l’exemple pour CList::RemoveHead
.
CList::GetHead
Obtient l’élément head (ou une référence à l’élément head) de cette liste.
const TYPE& GetHead() const;
TYPE& GetHead();
Paramètres
TYPE
Paramètre de modèle spécifiant le type d’objet dans la liste.
Valeur de retour
Si la liste est const
, GetHead
retourne une copie de l’élément à la tête de la liste. Cela permet à la fonction d’être utilisée uniquement sur le côté droit d’une instruction d’affectation et protège la liste contre la modification.
Si la liste n’est pas const
, GetHead
retourne une référence à l’élément en tête de la liste. Cela permet à la fonction d’être utilisée sur l’un ou l’autre côté d’une instruction d’affectation et permet ainsi aux entrées de liste d’être modifiées.
Notes
Vous devez vous assurer que la liste n’est pas vide avant d’appeler GetHead
. Si la liste est vide, la version de débogage de la bibliothèque de classes Microsoft Foundation affirme. Permet IsEmpty
de vérifier que la liste contient des éléments.
Exemple
// Define myList.
CList<CString, CString &> myList;
// Add an element to the front of the list.
myList.AddHead(CString(_T("ABC")));
// Verify the element was added to the front of the list.
ASSERT(CString(_T("ABC")) == myList.GetHead());
CList::GetHeadPosition
Obtient la position de l’élément principal de cette liste.
POSITION GetHeadPosition() const;
Valeur de retour
Valeur POSITION
qui peut être utilisée pour l’itération ou la récupération du pointeur d’objet ; NULL
si la liste est vide.
Exemple
// Define myList.
CList<CString, CString &> myList;
// Add an element to the front of the list.
myList.AddHead(CString(_T("ABC")));
// Verify the element at the head position
// is the one added.
POSITION pos = myList.GetHeadPosition();
ASSERT(CString(_T("ABC")) == myList.GetAt(pos));
CList::GetNext
Obtient l’élément de liste identifié par rPosition
, puis définit rPosition
la POSITION
valeur de l’entrée suivante dans la liste.
TYPE& GetNext(POSITION& rPosition);
const TYPE& GetNext(POSITION& rPosition) const;
Paramètres
TYPE
Paramètre de modèle spécifiant le type des éléments de la liste.
rPosition
Référence à une POSITION
valeur retournée par un appel de fonction membre précédent GetNext
, GetHeadPosition
ou autre.
Valeur de retour
Si la liste est const
, GetNext
retourne une copie d’un élément de la liste. Cela permet à la fonction d’être utilisée uniquement sur le côté droit d’une instruction d’affectation et protège la liste contre la modification.
Si la liste n’est pas const
, GetNext
retourne une référence à un élément de la liste. Cela permet à la fonction d’être utilisée sur l’un ou l’autre côté d’une instruction d’affectation et permet ainsi aux entrées de liste d’être modifiées.
Notes
Vous pouvez utiliser GetNext
dans une boucle d’itération avant si vous établissez la position initiale avec un appel à GetHeadPosition
ou Find
.
Vous devez vous assurer que votre POSITION
valeur représente une position valide dans la liste. S’il n’est pas valide, la version de débogage de la bibliothèque de classes Microsoft Foundation affirme.
Si l’élément récupéré est le dernier de la liste, la nouvelle valeur rPosition
est définie sur NULL.
Exemple
// Define myList.
// Define myList.
CList<CString, CString &> myList;
// Add two elements to the list.
myList.AddHead(CString(_T("ABC")));
myList.AddHead(CString(_T("123")));
// Dump the list elements to the debug window.
POSITION pos = myList.GetHeadPosition();
for (int i = 0; i < myList.GetCount(); i++)
{
TRACE(_T("%s\r\n"), (LPCTSTR)myList.GetNext(pos));
}
CList::GetPrev
Obtient l’élément de liste identifié par rPosition
, puis définit rPosition
la POSITION
valeur de l’entrée précédente dans la liste.
TYPE& GetPrev(POSITION& rPosition);
const TYPE& GetPrev(POSITION& rPosition) const;
Paramètres
TYPE
Paramètre de modèle spécifiant le type des éléments de la liste.
rPosition
Référence à une POSITION
valeur retournée par un appel de fonction membre précédent GetPrev
ou autre.
Valeur de retour
Si la liste est const
, GetPrev
retourne une copie de l’élément à la tête de la liste. Cela permet à la fonction d’être utilisée uniquement sur le côté droit d’une instruction d’affectation et protège la liste contre la modification.
Si la liste n’est pas const
, GetPrev
retourne une référence à un élément de la liste. Cela permet à la fonction d’être utilisée sur l’un ou l’autre côté d’une instruction d’affectation et permet ainsi aux entrées de liste d’être modifiées.
Notes
Vous pouvez utiliser GetPrev
dans une boucle d’itération inverse si vous établissez la position initiale avec un appel à GetTailPosition
ou Find
.
Vous devez vous assurer que votre POSITION
valeur représente une position valide dans la liste. S’il n’est pas valide, la version de débogage de la bibliothèque de classes Microsoft Foundation affirme.
Si l’élément récupéré est le premier de la liste, la nouvelle valeur rPosition
est définie NULL
sur .
Exemple
// Define myList.
CList<CString,CString&> myList;
// Add two elements to the list.
myList.AddHead(CString(_T("ABC")));
myList.AddHead(CString(_T("123")));
// Dump the list elements to the debug window,
// in reverse order.
POSITION pos = myList.GetTailPosition();
for (int i = 0; i < myList.GetCount(); i++)
{
TRACE(_T("%s\r\n"), (LPCTSTR)myList.GetPrev(pos));
}
CList::GetSize
Retourne le nombre d’éléments de liste.
INT_PTR GetSize() const;
Valeur de retour
Nombre d'éléments dans la liste.
Notes
Appelez cette méthode pour récupérer le nombre d’éléments de la liste. L’appel de cette méthode génère le même résultat que la CList::GetCount
méthode.
Exemple
// Define myList.
CList<CString, CString &> myList;
// Add two elements to the list.
myList.AddHead(CString(_T("ABC")));
myList.AddHead(CString(_T("123")));
// Remove the head element and verify the list.
// NOTE: once the head is removed, the number of
// elements in the list will be one.
CString strHead = myList.RemoveHead();
ASSERT((CString(_T("123")) == strHead) && (myList.GetSize() == 1) &&
(CString(_T("ABC")) == myList.GetHead()));
CList::GetTail
Obtient le CObject
pointeur qui représente l’élément de fin de cette liste.
TYPE& GetTail();
const TYPE& GetTail() const;
Paramètres
TYPE
Paramètre de modèle spécifiant le type d’éléments dans la liste.
Valeur de retour
Consultez la description de la valeur de retour pour GetHead
.
Notes
Vous devez vous assurer que la liste n’est pas vide avant d’appeler GetTail
. Si la liste est vide, la version de débogage de la bibliothèque de classes Microsoft Foundation affirme. Permet IsEmpty
de vérifier que la liste contient des éléments.
Exemple
// Define myList.
CList<CString, CString &> myList;
// Add an element to the end of the list.
myList.AddTail(CString(_T("ABC")));
// Verify the element was added to the end of the list.
ASSERT(CString(_T("ABC")) == myList.GetTail());
CList::GetTailPosition
Obtient la position de l’élément tail de cette liste ; NULL
si la liste est vide.
POSITION GetTailPosition() const;
Valeur de retour
Valeur POSITION
qui peut être utilisée pour l’itération ou la récupération du pointeur d’objet ; NULL
si la liste est vide.
Exemple
// Define myList.
CList<CString,CString&> myList;
// Add an element to the end of the list.
myList.AddTail(CString(_T("ABC")));
// Verify the element at the end position
// is the one added.
POSITION pos = myList.GetTailPosition();
ASSERT(CString(_T("ABC")) == myList.GetAt(pos));
CList::InsertAfter
Ajoute un élément à cette liste après l’élément à la position spécifiée.
POSITION InsertAfter(POSITION position, ARG_TYPE newElement);
Paramètres
position
Valeur POSITION retournée par un appel de fonction membre ou Find
GetPrev
précédentGetNext
.
ARG_TYPE
Paramètre de modèle spécifiant le type de l’élément de liste.
newElement
Élément à ajouter à cette liste.
Valeur de retour
Valeur POSITION
qui peut être utilisée pour l’itération ou la récupération d’éléments de liste.
Exemple
// Define myList.
CList<CString, CString &> myList;
// Add three elements to the list.
POSITION pos = myList.AddHead(CString(_T("XYZ")));
pos = myList.InsertAfter(pos, CString(_T("ABC")));
pos = myList.InsertAfter(pos, CString(_T("123")));
// Verify the tail element is what's expected.
ASSERT(CString(_T("123")) == myList.GetTail());
CList::InsertBefore
Ajoute un élément à cette liste avant l’élément à la position spécifiée.
POSITION InsertBefore(POSITION position, ARG_TYPE newElement);
Paramètres
position
Valeur POSITION
retournée par un appel de fonction membre ou Find
GetPrev
précédentGetNext
.
ARG_TYPE
Paramètre de modèle qui spécifie le type de l’élément de liste (peut être une référence).
newElement
Élément à ajouter à cette liste.
Valeur de retour
Valeur POSITION
qui peut être utilisée pour l’itération ou la récupération d’éléments de liste.
Notes
Si position
c’est NULL
le cas, l’élément est inséré à la tête de la liste.
Exemple
// Define myList.
CList<CString, CString &> myList;
// Add three elements to the list.
POSITION pos = myList.AddHead(CString(_T("XYZ")));
pos = myList.InsertBefore(pos, CString(_T("ABC")));
pos = myList.InsertBefore(pos, CString(_T("123")));
// Verify the head element is what's expected.
ASSERT(CString(_T("123")) == myList.GetHead());
CList::IsEmpty
Indique si cette liste ne contient aucun élément.
BOOL IsEmpty() const;
Valeur de retour
Différent de zéro si cette liste est vide ; sinon 0.
Exemple
// Define myList.
CList<CString, CString &> myList;
// Add three elements to the list.
myList.AddTail(CString(_T("XYZ")));
myList.AddTail(CString(_T("ABC")));
myList.AddTail(CString(_T("123")));
// Remove the head element until the list is empty.
CString str;
while (!myList.IsEmpty())
{
str = myList.RemoveHead();
TRACE(_T("%s\r\n"), (LPCTSTR)str);
}
CList::RemoveAll
Supprime tous les éléments de cette liste et libère la mémoire associée.
void RemoveAll();
Notes
Aucune erreur n’est générée si la liste est déjà vide.
Exemple
// Define myList.
CList<CString, CString&> myList;
// Add three elements to the list.
myList.AddTail(CString(_T("XYZ")));
myList.AddTail(CString(_T("ABC")));
myList.AddTail(CString(_T("123")));
// Remove all of the elements in the list.
myList.RemoveAll();
// Verify the list is empty.
ASSERT(myList.IsEmpty());
CList::RemoveAt
Supprime l’élément spécifié de cette liste.
void RemoveAt(POSITION position);
Paramètres
position
Position de l’élément à supprimer de la liste.
Notes
Vous devez vous assurer que votre POSITION
valeur représente une position valide dans la liste. S’il n’est pas valide, la version de débogage de la bibliothèque de classes Microsoft Foundation affirme.
Exemple
// Define myList.
CList<CString, CString&> myList;
// Add three elements to the list.
myList.AddTail(CString(_T("XYZ")));
myList.AddTail(CString(_T("ABC")));
myList.AddTail(CString(_T("123")));
// Remove CString("ABC") from the list.
myList.RemoveAt(myList.FindIndex(1));
// Verify CString("ABC") is not in the list.
ASSERT(myList.Find(CString(_T("ABC"))) == NULL);
CList::RemoveHead
Supprime l’élément de la tête de la liste et retourne un pointeur vers celui-ci.
TYPE RemoveHead();
Paramètres
TYPE
Paramètre de modèle spécifiant le type d’éléments dans la liste.
Valeur de retour
Élément précédemment à la tête de la liste.
Notes
Vous devez vous assurer que la liste n’est pas vide avant d’appeler RemoveHead
. Si la liste est vide, la version de débogage de la bibliothèque de classes Microsoft Foundation affirme. Permet IsEmpty
de vérifier que la liste contient des éléments.
Exemple
// Define myList.
CList<CString, CString&> myList;
// Add two elements to the list.
myList.AddHead(CString(_T("ABC")));
myList.AddHead(CString(_T("123")));
// Remove the head element and verify the list.
// NOTE: once the head is removed, the number of
// elements in the list will be one.
CString strHead = myList.RemoveHead();
ASSERT((CString(_T("123")) == strHead) && (myList.GetCount() == 1) &&
(CString(_T("ABC")) == myList.GetHead()));
CList::RemoveTail
Supprime l’élément de la fin de la liste et retourne un pointeur vers celui-ci.
TYPE RemoveTail();
Paramètres
TYPE
Paramètre de modèle spécifiant le type d’éléments dans la liste.
Valeur de retour
Élément situé à la fin de la liste.
Notes
Vous devez vous assurer que la liste n’est pas vide avant d’appeler RemoveTail
. Si la liste est vide, la version de débogage de la bibliothèque de classes Microsoft Foundation affirme. Permet IsEmpty
de vérifier que la liste contient des éléments.
Exemple
// Define myList.
CList<CString, CString &> myList;
// Add two elements to the list.
myList.AddTail(CString(_T("ABC")));
myList.AddTail(CString(_T("123")));
// Remove the tail element and verify the list.
// NOTE: once the tail is removed, the number of
// elements in the list will be one.
CString strTail = myList.RemoveTail();
ASSERT((CString(_T("123")) == strTail) && (myList.GetCount() == 1) &&
(CString(_T("ABC")) == myList.GetTail()));
CList::SetAt
Une variable de type POSITION
est une clé pour la liste.
void SetAt(POSITION pos, ARG_TYPE newElement);
Paramètres
pos
Élément POSITION
à définir.
ARG_TYPE
Paramètre de modèle qui spécifie le type de l’élément de liste (peut être une référence).
newElement
Élément à ajouter à la liste.
Notes
Ce n’est pas le même qu’un index, et vous ne pouvez pas opérer sur une POSITION
valeur vous-même. SetAt
écrit l’élément à la position spécifiée dans la liste.
Vous devez vous assurer que votre POSITION
valeur représente une position valide dans la liste. S’il n’est pas valide, la version de débogage de la bibliothèque de classes Microsoft Foundation affirme.
Exemple
// Define myList.
CList<CString, CString &> myList;
// Add three elements to the list.
myList.AddTail(CString(_T("XYZ")));
myList.AddTail(CString(_T("ABC")));
myList.AddTail(CString(_T("123")));
// Replace CString("ABC") with CString("CBA")
POSITION pos = myList.Find(CString(_T("ABC")));
myList.SetAt(pos, CString(_T("CBA")));
// Verify CString("ABC") is not in the list.
ASSERT(myList.Find(CString(_T("ABC"))) == NULL);
Voir aussi
Exemple MFC COLLECT
CObject
Classe
Graphique hiérarchique
CMap
Classe
CArray
Classe