Exercice 87
Énoncé
L’exercice 77 vous avait proposé de créer une classe set_int permettant de
représenter des ensembles de nombres entiers :
class set_int
{
int * adval ; // adresse du tableau des valeurs
int nmax ; // nombre maxi d'éléments
int nelem ; // nombre courant d'éléments
public :
set_int (int = 20) ; // constructeur
~set_int () ; // destructeur
...... // autres fonctions membre
} ;
Son implémentation prévoyait de placer les différents éléments dans un tableau
alloué dynamiquement ; aussi l’affectation entre objets de type set_int posait-elle des
problèmes, puisqu’elle aboutissait à des objets différents comportant des pointeurs
sur un même emplacement dynamique.
Modifier la classe set_int pour qu’elle ne présente plus de telles lacunes. On
prévoira que tout objet de type set_int comporte son propre emplacement dynamique,
comme on l’avait fait pour permettre la transmission par valeur. De plus, on
s’arrangera pour que l’affectation multiple soit utilisable.
Nous sommes en présence d’un problème voisin de celui posé par le constructeur par
recopie. Nous l’avions résolu en prévoyant ce que l’on appelle une « copie profonde »
de l’objet concerné (c’est-à-dire une copie non seulement de l’objet lui-même, mais de
toutes ses parties dynamiques). Quelques différences supplémentaires surgissent
néanmoins. En effet, ici :
on peut se trouver en présence d’une affectation d’un objet à lui-même ;
avant affectation, il existe deux objets « complets » (avec leur partie dynamique),
alors que dans le cas du constructeur par recopie, il n’existait qu’un seul objet, le
second étant à créer.
Voici comment traiter l’affectation b = a, dans le cas où b est différent de a :
libération de l’emplacement pointé par b ;
205
Énoncé
L’exercice 77 vous avait proposé de créer une classe set_int permettant de
représenter des ensembles de nombres entiers :
class set_int
{
int * adval ; // adresse du tableau des valeurs
int nmax ; // nombre maxi d'éléments
int nelem ; // nombre courant d'éléments
public :
set_int (int = 20) ; // constructeur
~set_int () ; // destructeur
...... // autres fonctions membre
} ;
Son implémentation prévoyait de placer les différents éléments dans un tableau
alloué dynamiquement ; aussi l’affectation entre objets de type set_int posait-elle des
problèmes, puisqu’elle aboutissait à des objets différents comportant des pointeurs
sur un même emplacement dynamique.
Modifier la classe set_int pour qu’elle ne présente plus de telles lacunes. On
prévoira que tout objet de type set_int comporte son propre emplacement dynamique,
comme on l’avait fait pour permettre la transmission par valeur. De plus, on
s’arrangera pour que l’affectation multiple soit utilisable.
Nous sommes en présence d’un problème voisin de celui posé par le constructeur par
recopie. Nous l’avions résolu en prévoyant ce que l’on appelle une « copie profonde »
de l’objet concerné (c’est-à-dire une copie non seulement de l’objet lui-même, mais de
toutes ses parties dynamiques). Quelques différences supplémentaires surgissent
néanmoins. En effet, ici :
on peut se trouver en présence d’une affectation d’un objet à lui-même ;
avant affectation, il existe deux objets « complets » (avec leur partie dynamique),
alors que dans le cas du constructeur par recopie, il n’existait qu’un seul objet, le
second étant à créer.
Voici comment traiter l’affectation b = a, dans le cas où b est différent de a :
libération de l’emplacement pointé par b ;
205
