• Aucun résultat trouvé

Cours langage C++ classes imbriquées – Cours et formation gratuit

N/A
N/A
Protected

Academic year: 2022

Partager "Cours langage C++ classes imbriquées – Cours et formation gratuit"

Copied!
4
0
0

Texte intégral

(1)

Le langage C++ 213

CHAPITRE 13

Classes imbriquées

(2)

einev Télécommunications mjn

214 Le langage C++

13.1

Motivation

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 Linke- dList, 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'identi-

(3)

Le langage C++ 215

einev Télécommunications mjn

ficateur 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 glo- baux. 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 pro- fiter de certaines fonctionnalités déjà développées dans le cadre d'un autre sous-système. Cet- te 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 diver- ses 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.

(4)

einev Télécommunications mjn

216 Le langage C++

13.2

Alternative

A vrai dire, il est possible de cacher encore beaucoup plus efficacement une implémen- tation à l'aide d'un pointeur sur une classe non exportée, comme nous l'avons déjà vu lors de notre discussion sur les membres privés, et la manière de se protéger contre des accès inauto- risés :

Fichier llist.h :

class ListImplem;// Classe simplement déclarée par son identificateur, // mais pas par son interface.

class LinkedList {

private :

ListImplem *_impl;

LinkedList& operator=(LinkedList& l);

LinkedList(LinkedList&);

public :

LinkedList();

~LinkedList();

void addToList(const void *newData);

....

};

Fichier llist.C : // non exporté, en principe inaccessible class ListImplem

{

public :

struct ListElement {

void* data;

ListElement *next, *previous;

};

ListElement *head, *tail;

ListImplem();

~ListImplem();

...

};

Dans la mesure du possible, plus l'interface à une classe est concis, plus il est simple à comprendre. Une bonne manière de le rendre concis est donc de le débarasser de tout ce qui ne concerne pas directement les utilisateurs, soit les membres privés, essentiellement, même s'il faut pour cela faire quelques concessions sur les fonctions inline.

Il serait faux, en revanche, de limiter l'utilisabilité de la classe de manière à rendre cet interface concis. Une classe trop limitée ne sera pas utilisée. Si un interface semble devenir trop large et trop complexe, il vaut la peine de se demander si l'on n'a pas fait une erreur lors de la définition de la classe, et si un redesign ne serait pas approprié.

Références

Documents relatifs

Un autre avantage de ce langage de programmation réside dans le fait que la syntaxe de Java est analogue à celle de C++ ce qui le rend économique et professionnel.. Le fait de

Celle-ci est symbolisée dans l'exemple ci-dessus par deux cadres : la variable I et la procédure LIGNE (avec un argument entier) sont déclarées dans REMPLIR, et donc connues dans

Dans un langage de balisage, tout contenu, qu’il s’agisse de texte, d’image ou d’éléments multimédias les plus divers, doit être renfermés dans un élément.. En XHTML,

Dans le body, vous encodez les balises comme le Html 4.0 en respectant les règles de syntaxe du XHTML comme détaillé au point

Une variable de type C peut faire référence à un objet de la classe C. hauteur

Le modèle des classes d’UML saisit la structure statique d'un système en montrant les objets dans le système, les relations entre les objets, les attributs et

© Dunod. La photocopie non autorisée est un délit... Essayer d’appliquer le théorème du cours sur continuité et conver- gence uniforme sur tout segment de l’intervalle

Les génériques permettent donc, en quelques sortes, de déclarer une série de classes (potentielles) en une seule fois, ou plus exactement de déclarer un modèle de classe, mais avec