Vous êtes sur la page 1sur 3

BTS INTIC errachidia

Page 1

25/10/2010

Classes et objets (Suite)


Problme Supposons que nous voulons crer un compteur d'objets cres partir de la classe point qui sera incrment a chaque appel de constructeur et dcrment chaque appel de destructeur !? Une solution simple mais non pratique consiste dclarer une variable globale qui s'incrmente dans le constructeur et se dcrmente dans le destructeur! Le problme c'est que une variable qui ne fait pas partie de la classe arrive y accder ce qui contredit le principe de la P.O.O et l'encapsulation

Exemple tester
#include <iostream.h> /* ------- Dclaration de la classe point --------- */ int compteur =0; class point { /* dclaration "classique" des donnes */ int x ; int y ; /* dclaration des fonctions membres (mthodes) */ public : point (int, int) ; void deplace (int, int) ; void affiche () ; ~point(); } ; /* ----Dfinition des fonctions membres du type point ---- */ point::point (int abs, int ord) { x = abs ; y = ord ; compteur++; } void point::deplace (int dx, int dy) { x += dx ; y += dy ; } void point::affiche () { cout << "Je suis en " << x << " " <<y<<" compteur= " <<compteur<< "\n" ; } point::~point () { compteur--; cout<<"compteur = "<<compteur<<endl; } main() { point a(5,2); a.affiche () ; a.deplace (3,1) ; a.affiche () ; point b(-2,4) ; b.affiche () ; }

P.O.O

M43

M.Semghouni

BTS INTIC errachidia

Page 2

25/10/2010

Solution POO Dans ce cas nous avons besoin d'une variable qui soit partage par tous les objets, ceci consiste a qualifier la variable de static on parle alors de variable de classe c'est--dire une seule variable qui appartient a tous les objets D'o la dclaration
/* --- Dclaration de la classe point avec attribut static --- */ class point{ static int compteur; int x ; int y ; public : point (int, int) ; void deplace (int, int) ; void affiche () ; } ;

Initialisation des membres donns statiques Une donne statique est une donne de la classe ce qui veut dire qu'elle existe en un seul exemplaire, indpendamment des objets de la classe. Son initialisation doit tre faite mme si aucun objet n'a encore exist. Donc un membre statique doit tre initialis l'extrieur de la dclaration de la classe comme suit : int point::compteur =0; - Tester dans l'exemple de point d'crire int x = 0 dans la dclaration de la classe puis tester la mme chose pour la donne statique
int point::compteur=0; point::point (int abs, int ord) {x = abs ; y = ord ;compteur++; cout<<"il existe "<<compteur <<" points "<<endl ; } void point::deplace (int dx, int dy) { x = x + dx ; y = y + dy ; } void point::affiche () { cout << "Je suis en " << x << " " << y << "\n" ; } point::~point () {compteur--; cout<<"il existe "<<compteur <<" points"<<endl ; }

- Une donne statique constante peut tre initialise au moment de sa dclaration mais il reste aussi une autre initialisation extrieure sans valeur pour pouvoir rserver l'espace mmoire correspondant Exemple class exple3
{ static const int n=5 ; // initialisation OK depuis la norme ANSI ..... } const int exple3::n ; // dclaration indispensable (sans valeur)

P.O.O

M43

M.Semghouni

BTS INTIC errachidia

Page 3

25/10/2010

- il est conseill de prvoir linitialisation des membres donns statiques dans le fichier contenant la dfinition de la classe (compilation spare). Le problme ne se pose pas au cas o on 'a qu'un seul fichier source Recherche - Ecrire une classe ayant un attribut constant que vous initialiser une valeur donne - soit l'criture
point::point (int abs, int ord) { x = abs ; y = ord ; compteur++; cout<<"il existe "<<compteur <<" points "<<endl ; }

Il existe une autre faon d'crire le mme constructeur essayez de la trouver

P.O.O

M43

M.Semghouni

Vous aimerez peut-être aussi