Cours langage C++ classes imbriquées, tutoriel & guide de travaux pratiques en pdf.
A partir de la version 3.0 de la spécification du langage C++, il est possible d’utiliser des types imbriqués. Cette fonctionnalité permet de cacher des détails d’implémentation en les rendant purement locaux à une classe donnée, comme dans l’exemple suivant :
class LinkedList {
private : struct ListElement
{ void* data; ListElement *next, *previous;
}; LinkedList&operator=(LinkedList& l);
LinkedList(LinkedList&);
ListElement *head, *tail; public : LinkedList(); ~LinkedList();
void addToList(const void *newData);
…. };
L’élément de la liste n’est pas accessible en dehors des méthodes de la classe LinkedList, puisque la définition du type se fait dans le contexte de la classe uniquement. L’élément englobé, lui, n’a qu’une visibilité très limitée: int x, y;
class outer {
public : int x;
static int staticVar;
class inner {
void someFunc(int anInt)
{ x = anInt; // Erreur, outer::x n’est pas accessible. // outer::x ne correspond pas à une instance staticVar = anInt; // staticVar est statique, ok ::x = anInt; // Ok, variable globale y = anInt; // Ok, variable globale
} void anotherFunc(outer *outerPtr, int anInt)
{ outerPtr->
x = anInt; // Ok, accès à un membre de la // classe englobante par un // pointeur. }
} };
Un autre avantage de la définition de classes imbriquées réside dans le fait que l’identificateur de classe, étant local au contexte d’une classe englobante, n’apparaît pas à l’extérieur du contexte de la classe. Il n’apparaît de ce fait pas non plus dans la table de symboles globaux. Un programme C++, comme tout programme orienté objets, essaie de réutiliser un maximum de code, quitte à importer également des fonctionnalités inutiles, à seule fin de profiter de certaines fonctionnalités déjà développées dans le cadre d’un autre sous-système. Cette manière de faire tend à remplir la table de symboles globaux d’identificateurs inutiles, qui peuvent éventuellement créer des conflits lors de la réutilisation de code provenant de diverses sources indépendantes. On parle dans le jargon technique de C++ de « global name space pollution ». Toute technique permettant d’éviter d’exporter des identificateurs inutiles dans la table de symboles globale est de ce point de vue, utile. Utiliser des classes imbriquées est une manière de faire tout à fait efficace de ce point de vue.