Exercice 94
Énoncé
Adapter la classe point :
class point
{
int x, y ;
// .......
public :
point (int abs=0, int ord=0) // constructeur
// .....
} ;
de façon qu’elle dispose de deux fonctions membre permettant de connaître, à tout
instant, le nombre total d’objets de type point, ainsi que le nombre d’objets
dynamiques (c’est-à-dire créés par new) de ce même type.
Ici, il n’est plus possible de se contenter de comptabiliser les appels au constructeur et
au destructeur. Il faut, en outre, comptabiliser les appels à new et delete. La seule
possibilité pour y parvenir consiste à surdéfinir ces deux opérateurs pour la classe
point. Le nombre de points total et le nombre de points dynamiques seront conservés
dans des membres statiques (n’existant qu’une seule fois pour l’ensemble des objets du
type point). Quant aux fonctions membre fournissant les informations voulues, il est
préférable d’en faire des fonctions membre statiques (déclarées, elles aussi, avec
l’attribut static), ce qui permettra de les employer plus facilement que si on en avait fait
des fonctions membre ordinaires (puisqu’on pourra les appeler sans avoir à les faire
porter sur un objet particulier).
Voici ce que pourrait être notre classe point (déclaration et définition) :
#include // pour size_t
#include
using namespace std ;
class point
{ static int npt ; // nombre total de points
static int nptd ; // nombre de points dynamiques
int x, y ;
public :
point (int abs=0, int ord=0) // constructeur
{ x=abs ; y=ord ;
npt++ ;
}
~point () // destructeur
{ npt-- ;
}
void * operator new (size_t sz) // new surdéfini
224
Énoncé
Adapter la classe point :
class point
{
int x, y ;
// .......
public :
point (int abs=0, int ord=0) // constructeur
// .....
} ;
de façon qu’elle dispose de deux fonctions membre permettant de connaître, à tout
instant, le nombre total d’objets de type point, ainsi que le nombre d’objets
dynamiques (c’est-à-dire créés par new) de ce même type.
Ici, il n’est plus possible de se contenter de comptabiliser les appels au constructeur et
au destructeur. Il faut, en outre, comptabiliser les appels à new et delete. La seule
possibilité pour y parvenir consiste à surdéfinir ces deux opérateurs pour la classe
point. Le nombre de points total et le nombre de points dynamiques seront conservés
dans des membres statiques (n’existant qu’une seule fois pour l’ensemble des objets du
type point). Quant aux fonctions membre fournissant les informations voulues, il est
préférable d’en faire des fonctions membre statiques (déclarées, elles aussi, avec
l’attribut static), ce qui permettra de les employer plus facilement que si on en avait fait
des fonctions membre ordinaires (puisqu’on pourra les appeler sans avoir à les faire
porter sur un objet particulier).
Voici ce que pourrait être notre classe point (déclaration et définition) :
#include
#include
using namespace std ;
class point
{ static int npt ; // nombre total de points
static int nptd ; // nombre de points dynamiques
int x, y ;
public :
point (int abs=0, int ord=0) // constructeur
{ x=abs ; y=ord ;
npt++ ;
}
~point () // destructeur
{ npt-- ;
}
void * operator new (size_t sz) // new surdéfini
224
