Vous êtes sur la page 1sur 3

BTS INTIC errachidia

Page 1

31/10/2010

Classes et objets (Suite)

Problème Supposons que nous voulons créer un compteur d'objets crées à partir de la classe point qui sera incrémenté a chaque appel de constructeur et décrémenté à chaque appel de destructeur !?

Une solution simple mais non pratique consiste à déclarer une variable globale qui s'incrémente dans le constructeur et se décrémente dans le destructeur! Le problème c'est que une variable qui ne fait pas partie de la classe arrive à y accéder ce qui contredit le principe de la P.O.O et l'encapsulation

Exemple à tester

#include <iostream.h> /* ------- Déclaration de la classe point --------- */

int compteur =0;

class point { /* déclaration "classique" des données */ int x ; int y ; /* déclaration des fonctions membres (méthodes) */ public :

point (int, int) ; void deplace (int, int) ; void affiche () ; ~point();

}

;

/* ----Définition 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=

}

point::~point ()

"<<compteur<< "\n" ;

{

 

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

31/10/2010

Solution POO

Dans ce cas nous avons besoin d'une variable qui soit partagée par tous les

objets, ceci consiste a qualifier la variable de static

de classe c'est-à-dire une seule variable qui appartient a tous les objets

D'où la déclaration

/* --- Déclaration de la classe point avec attribut static --- */ class point{ static int compteur; int x ; int y ; public :

on parle alors de variable

point (int, int) ; void deplace (int, int) ; void affiche () ;

}

;

Initialisation des membres donnés statiques Une donnée statique est une donnée de la classe ce qui veut dire qu'elle existe en un seul exemplaire, indépendamment des objets de la classe. Son initialisation doit être faite même si aucun objet n'a encore existé. Donc un membre statique doit être initialisé à l'extérieur de la déclaration de la classe comme suit : int point::compteur =0; - Tester dans l'exemple de point d'écrire int x = 0 dans la déclaration de la classe puis tester la même chose pour la donnée 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 donnée statique constante peut être initialisée au moment de sa déclaration mais il reste aussi une autre initialisation extérieure sans valeur pour pouvoir réserver l'espace mémoire correspondant

Exemple class exple3 { static const int n=5 ; // initialisation OK depuis la norme ANSI

}

const int exple3::n ; // déclaration indispensable (sans valeur)

P.O.O

M43

M.Semghouni

BTS INTIC errachidia

Page 3

31/10/2010

- il est conseillé de prévoir l’initialisation des membres donnés statiques dans le fichier contenant la définition de la classe (compilation séparée). Le problème 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 donnée

- soit l'écriture

point::point (int abs, int ord)

{

x

= abs ;

y

= ord ;

compteur++;

cout<<"il existe "<<compteur <<" points "<<endl ;

}

Il existe une autre façon d'écrire le même constructeur essayez de la trouver

P.O.O

M43

M.Semghouni