62
Chapitre VIII Chapitre VIII Structures d’objets

Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Embed Size (px)

Citation preview

Page 1: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIIIChapitre VIII

Structures d’objets

Page 2: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 2

Structures d ’objets

Il existe plusieurs relations entre les classes.Il existe plusieurs relations entre les classes.

L’héritage n’est pas la seule technique permettant de relier 2 classes.L’héritage n’est pas la seule technique permettant de relier 2 classes.

D’autres possibilités:D’autres possibilités:

les classes internes: classes à l’intérieur d’une autre classe

limite la portée d’utilisation

les associations d’objets

les agrégations d’objets: un objet est défini à partir d’un ou plusieurs objets(objets composites)

On peut aussi gérer une collection d’objets: tableaux d’objets, listes d’objets, etc.On peut aussi gérer une collection d’objets: tableaux d’objets, listes d’objets, etc.

Page 3: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 3

Tableaux statiques d’objetsSyntaxe Ex. Objet_2D Ensemble_objets[20];

nom d’une classe3 contraintes:Le nombre d’éléments doit être connu à la création du tableau.

La classe pour laquelle vous définissez un tableau doit obligatoirement posséder unconstructeur sans argument car, le constructeur de la classe sera appelé pour chacunde ces objets.Tous les objets appartiennent à la même classe.

Ex.: const Nombre_de_polygones = 25;Polygone_2D Scene_2D[Nombre_de_polygones];……..For (int i = 0; i < Nombre_de_polygones; i++)

cout << Scene_2D[i].Nombre_de_sommets();

Page 4: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 4

Tableaux statiques de pointeurs d’objets

Pour définir un tableau qui soit capable de gérer des objets appartenant à plusieursclasses, vous devrez stocker dans ce tableau non pas des objets, mais des pointeursd’objets.

Si le type du pointeur correspond à un pointeur de la classe de base, ce tableau pourracontenir les adresses de n’importe quel objet dérivé de cette classe.

On dispose alors d’un seul et même tableau pouvant stocker les adressesd’objets différents.

On doit nous-même créer dynamiquement ces objets et stocker leurs adresses dans letableau (opérateur new).

Pour simplifier la gestion d’un tableau de pointeurs d’objets, il est conseillé de définirune classe spécialisée dans ce domaine.

On peut ainsi centraliser tous les traitements liés à la gestion du tableau.

Page 5: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 5

Tableaux statiques de pointeurs d’objets

const Nombre_maximum_elements = 20;class classe_de_base{};class Tableau_statique_de_pointeurs{/* Spécification fonctionnelle de la classe

"Tableau_statique_de_pointeurs" */

protected:int Nombre_elements_presents;classe_de_base *Tableau_statique[Nombre_maximum_elements];

Page 6: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 6

Tableaux statiques de pointeurs d’objets

public:Tableau_statique_de_pointeurs();/* Permet de créer un tableau statique de pointeurs où les

composantes sont initialisées à NULL.Pré - Nil.Post - Un tableau vide de pointeurs d'objets est créé.*/

void Inserer_pointeur_objet(int i, classe_de_base * pObjet);/* Permet d'insérer le pointeur d'un objet en position i.

Pré - 1 <= i <= Nombre_maximum_elements.Il n'existe pas de pointeur d'objet à cette position.

Post - L'élément est inséré en position i. */

Page 7: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 7

Tableaux statiques de pointeurs d’objets

classe_de_base * Enlever_pointeur_objet(int i);/* Permet s'il existe d'enlever l'objet en position i du tableau

et de retourner son adresse. Autrement, NULL est retournée.Pré - 1 <= i <= Nombre_maximum_elements.Post - Il n'existe plus d'objet en position i du tableau.

S'il en existait un, son adresse est retournée. */int Rechercher_place_disponible();/* Retourne la position d'un élément du tableau où il n'y a pas

d'objet. S'il n'existe aucune place disponible, la valeur 0est retournée.Pré - NilPost - Retourne la position d'un espace disponible.0 autrement.*/

Page 8: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 8

Tableaux statiques de pointeurs d’objets

int Nb_elements_presents();/* Retourne le nombre d'objets présents dans le tableau.

Pré - NilPost - Retourne le nombre de pointeurs d'objets présents

dans le tableau. */};

Page 9: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 9

Tableaux statiques de pointeurs d’objets

#include "Tableau_statique_de_pointeurs.h"#include "stdio.h"Tableau_statique_de_pointeurs::Tableau_statique_de_pointeurs(){

Nombre_elements_presents = 0;for (int i = 0; i < Nombre_maximum_elements; i++)

Tableau_statique[i] = NULL;}void Tableau_statique_de_pointeurs::Inserer_pointeur_objet

(int i, classe_de_base * pObjet){

Nombre_elements_presents += 1; Tableau_statique[i-1] = pObjet;}

Page 10: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 10

Tableaux statiques de pointeurs d’objets

classe_de_base * Tableau_statique_de_pointeurs::Enlever_pointeur_objet(int i)

{ classe_de_base * p;if (Tableau_statique[i-1] != NULL)

Nombre_elements_presents -= 1;p = Tableau_statique[i-1]; Tableau_statique[i-1] = NULL;return p;

}int Tableau_statique_de_pointeurs::Rechercher_place_disponible(){ for (int i = 0; i< Nombre_maximum_elements; i++)

if(Tableau_statique[i] == NULL) return i+1;return 0;

}

Page 11: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 11

Tableaux statiques de pointeurs d’objets

int Tableau_statique_de_pointeurs::Nb_elements_presents(){

return Nombre_elements_presents;}

#include <iostream.h>#include "Tableau_statique_de_pointeurs.h"class dossier_medical: public classe_de_base{

// .......};

Page 12: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 12

Tableaux statiques de pointeurs d’objets

void main(){

dossier_medical A, B, C;Tableau_statique_de_pointeurs T;T.Inserer_pointeur_objet(1, &A);T.Inserer_pointeur_objet(5, &B);T.Inserer_pointeur_objet(T.Rechercher_place_disponible(), &C);cout << "Nombre de dossiers medicaux: "

<< T.Nb_elements_presents();T.Enlever_pointeur_objet(5);cout << "Nombre de dossiers medicaux: "

<< T.Nb_elements_presents();}

Page 13: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 13

Tableaux dynamiques de pointeurs d’objets

Tableaux dont le nombre d’éléments peut être fixé à l’exécution du programme.

pointeur = new Type[nombre];

où Type désigne un type du langage et peut correspondre. aux types primaires du C++,. à tout type créé (structure, classe, etc.)

où nombre peut correspondre à une variable ou à une expression,

où pointeur permet de stocker l’adresse du premier élément du tableau.

Un tableau dynamique doit être explicitement détruit.

delete [] pointeur;

Cette syntaxe estobligatoire

pour libérer toutel’espace mémoire.

Page 14: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 14

Tableaux dynamiques de pointeurs d’objets

Ex.: int Nombre_de_polygones = 25;Polygone_2D * pScene_2D = new Polygone_2D [Nombre_de_polygones];……..For (int i = 0; i < Nombre_de_polygones; i++)

cout << pScene_2D[i].Nombre_de_sommets();

Les tableaux dynamiques conservent un des inconvénients des tableaux statiques:

le nombre d’éléments ne peut pas être modifié après la création du tableau.

Listes chaînées (à venir)

Page 15: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 15

Tableaux dynamiques de pointeurs d’objets

class Classe_de_base{};typedef Classe_de_base * pClasse_de_base;class Tableau_dynamique_de_pointeurs{/* Spécification fonctionnelle de la classe

"Tableau_dynamique_de_pointeurs" */protected:

int Nombre_maximum_elements;int Nombre_elements_presents;pClasse_de_base * pTab_dynamique;

Page 16: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 16

Tableaux dynamiques de pointeurs d’objets

public:Tableau_dynamique_de_pointeurs(int Nb_maximum_elements);/* Permet de créer un tableau dynamique de pointeurs où les

composantes sont initialisées à NULL. Le nombred’éléments du tableau est passé en paramètre.Pré - Nil.Post - Un tableau vide de pointeurs d'objets est créé.*/

void Inserer_pointeur_objet(int i, Classe_de_base * pObjet);/* Permet d'insérer le pointeur d'un objet en position i.

Pré - 1 <= i <= Nombre_maximum_elements.Il n'existe pas de pointeur d'objet à cette position.

Post - L'élément est inséré en position i. */

Page 17: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 17

Tableaux dynamiques de pointeurs d’objets

Classe_de_base * Enlever_pointeur_objet(int i);/* Permet s'il existe d'enlever l'objet en position i du tableau

et de retourner son adresse. Autrement, NULL est retournée.Pré - 1 <= i <= Nombre_maximum_elements.Post - Il n'existe plus d'objet en position i du tableau.

S'il en existait un, son adresse est retournée. */int Rechercher_place_disponible();/* Retourne la position d'un élément du tableau où il n'y a pas

d'objet. S'il n'existe aucune place disponible, la valeur 0est retournée.Pré - NilPost - Retourne la position d'un espace disponible.0 autrement.*/

Page 18: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 18

Tableaux dynamiques de pointeurs d’objets

int Nb_elements_presents();/* Retourne le nombre d'objets présents dans le tableau.

Pré - NilPost - Retourne le nombre de pointeurs d'objets présents

dans le tableau. */};

Page 19: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 19

Tableaux dynamiques de pointeurs d’objets

#include "Tableau_dynamique_de_pointeurs.h"#include <iostream.h>Tableau_dynamique_de_pointeurs::Tableau_dynamique_de_pointeurs

(int Nb_maximum_elements){

Nombre_maximum_elements = Nb_maximum_elements;Nombre_elements_presents = 0;pTab_dynamique = new pClasse_de_base

[Nombre_maximum_elements];for (int i = 0; i < Nombre_maximum_elements; i++)

pTab_dynamique[i] = NULL;}

Page 20: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 20

Tableaux dynamiques de pointeurs d’objets

void Tableau_dynamique_de_pointeurs::Inserer_pointeur_objet(int i, Classe_de_base * pObjet)

{Nombre_elements_presents += 1;pTab_dynamique[i-1] = pObjet;

}Classe_de_base * Tableau_dynamique_de_pointeurs::

Enlever_pointeur_objet(int i){ Classe_de_base * p;

if (pTab_dynamique[i-1] != NULL)Nombre_elements_presents -= 1;

p = pTab_dynamique[i-1]; pTab_dynamique[i-1] = NULL;return p;

}

Page 21: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 21

Tableaux dynamiques de pointeurs d’objets

int Tableau_dynamique_de_pointeurs::Rechercher_place_disponible(){

for (int i = 0; i< Nombre_maximum_elements; i++)if(pTab_dynamique[i] == NULL) return i+1;

return 0;}

int Tableau_dynamique_de_pointeurs::Nb_elements_presents(){

return Nombre_elements_presents;}

Page 22: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 22

Tableaux dynamiques de pointeurs d’objets

#include <iostream.h>#include "Tableau_dynamique_de_pointeurs.h"class dossier_medical: public Classe_de_base{

// .......};

Page 23: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 23

Tableaux dynamiques de pointeurs d’objets

void main(){

dossier_medical A, B, C;Tableau_dynamique_de_pointeurs T(10);T.Inserer_pointeur_objet(1, &A);T.Inserer_pointeur_objet(5, &B);T.Inserer_pointeur_objet(T.Rechercher_place_disponible(), &C);cout << "Nombre de dossiers medicaux: "

<< T.Nb_elements_presents();T.Enlever_pointeur_objet(5);cout << "Nombre de dossiers medicaux: "

<< T.Nb_elements_presents();}

Page 24: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 24

Listes chaînées

Liste_simple

Pile

File

Monceau

etc.

d ’"element " s

On peut créer des structures d’objetsdérivés de la classe "element ".

Page 25: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 25

Classes internes ou imbriquéesPermet de définir une classe à l’intérieur de la déclaration d’une autre classe.Permet de réduire l’utilisation de la classe interne à la classe qui la contient.

Les classes internes respectent les étiquettes de protection.

class Auto{

protected:char Reference[20+1]; char Marque[20+1];int Prix_vente;class Moteur;

public:Auto(char * Ref = "", char * M = "", int Prix = 0,

char * Caract = "", float Duree = 0.0);/* Permet de créer un objet Auto.

Pré - Nil.Post - L'objet Auto est créé en tenant compte des valeurs

par défaut pour les différents arguments */

référence avancée

Page 26: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 26

Classes internes

void Init_Prix_vente(int P);/* Initialise le prix de vente.

Pré - L'objet Auto est créé.Post - Le prix de vente est conservé. */

int Acces_Prix_vente();/* Fournit le prix de vente.

Pré - L'objet Auto est créé.Post - Retourne le prix de vente de l'auto. */

};

Page 27: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 27

Classes internes

class Auto::Moteur{

protected:char Caracteristiques[20+1];float Duree_de_vie;

public:void Init_Duree_de_vie(float D);/* Initialise la durée de vie.

Pré - L'objet Auto est créé.Post - La durée de vie est conservée.*/

float Acces_Duree_de_vie();/* Fournit la durée de vie.

Pré - L'objet Auto est créé.Post - Retourne la durée de vie du moteur de l’auto.*/

};

On fait toujours référence à la classe par son nom complet.

Page 28: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 28

Classes internes

class Auto_usagee : public Auto{

protected:char Nom_Ancien_Proprietaire[20+1];char Prenom_Ancien_Proprietaire[20+1];int Cout_achat;

public:Auto_usagee(char * Ref = "", char * M = "", int Prix = 0,

char * Caract = "", float Duree = 0.0, int Cout = 0,char * Nom = "", char * Prenom = "");

/* Permet de créer un objet Auto_usagee.Pré - Nil.Post - L'objet Auto_usagee est créé en tenant compte des valeurs

par défaut pour les différents arguments. */

Page 29: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 29

Classes internes

void Init_Cout_achat(int C);/* Initialise le coût d'achat.

Pré - L'objet Auto_usagee est créé.Post - Le coût d'achat est conservé. */

int Acces_Cout_achat();/* Fournit le coût d'achat.

Pré - L'objet Auto_usagee est créé.Post - Retourne le coût d'achat de l'auto usagée. */

};

Page 30: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 30

Classes internes#include <string.h>#include "Auto.h"Auto::Auto(char * Ref, char * M, int Prix, char * Caract, float Duree){

Prix_vente = Prix; strcpy(Marque, M); strcpy(Reference, Ref);Auto::Moteur::Duree_de_vie = Duree;strcpy(Auto::Moteur::Caracteristiques, Caract);

}void Auto::Moteur::Init_Duree_de_vie(float D){

Moteur::Duree_de_vie = D;}float Auto::Moteur::Acces_Duree_de_vie(){

return Moteur::Duree_de_vie;}

On fait toujours référence à laclasse par son nom complet.

Page 31: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 31

Classes internes

Auto_usagee::Auto_usagee(char * Ref, char * M, int Prix,char * Caract, float Duree, int Cout,char * Nom, char * Prenom)

:Auto(Ref, M, Prix, Caract, Duree){

Cout_achat = Cout;strcpy(Nom_Ancien_Proprietaire, Nom);strcpy(Prenom_Ancien_Proprietaire, Prenom);

}

Page 32: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 32

Classes internes#include <iostream.h>#include "Auto.h"void main(){

Auto A("R025", "Honda Civic", 22500, "Caracteristiques I", 8.5);Auto_usagee B("C2534", "Toyota", 18500, "Caracteristiques II",

7, 12550, "Duval", "Luc");Auto_usagee C("D123", "Capri");cout << A.Acces_Prix_vente();cout << B.Acces_Prix_vente(); cout << B.Acces_Cout_achat();cout << C.Acces_Prix_vente(); cout << C.Acces_Cout_achat();

Page 33: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 33

Classes internes/* La classe Moteur n'est pas accessible à cause de l'étiquette

protected.

Même si nous avions l'étiquette public, les fonctionsInit_Duree_de_vie et Acces_Duree_de_vie ne seraient pasdisponibles à partir de A, B ou C;

par contre, nous pourrions déclarer une variable de type Moteur:

Auto::Moteur M;M.Init_Duree_de_vie(7.5);

Les fonctions Init_Duree_de_vie & Acces_Duree_de_viedevraient plutôt être utilisées par les fonctions membres de la classe Auto. */

}

Classes internes "Classes locales"

Note : Les classes imbriquées sont utilisées dans la librairie STL pour construireune classe Iterator dans chaque structure de données.

Page 34: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 34

Association et agrégation d’objets

En dehors de l’héritage, il existe d’autres types de relation entre les classes.

Association

- La relation entre les classes qui est la plus générale mais aussi la plusfaible.

Ex.: Une liste chaînée où chaque objet dispose d’un lien vers l’objet suivant.

- Permet à un objet de posséder un lien vers un autre objet mais, aucun nefait partie de l’autre.

- Habituellement, une donnée membre de type pointeur vers l’objet associé.

Page 35: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 35

Association et agrégation d’objets

Association

Employé

Département

Compagnie

Directeurdirige

dirige

travaille

fait partie

Page 36: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 36

Association et agrégation d’objets

Agrégation

- Correspond à la définition d’un objet compositei.e. un objet créé à partir de plusieurs autres de classes distinctes.

On représente des composantes faisant partie d’un tout.

- Alternative à l’utilisation de l’héritage. Héritage et agrégation ont en com-mun le fait de créer automatiquement un objet à partir d’une autre classe.

relation composante / structure

Document Paragraphe Phrase

Le document est composé de paragraphes qui sont à leur tour composés dephrases.Relation transitive.

Page 37: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 37

Association et agrégation d’objets

Carte mère Processeur Mémoire RAM

Agrégation

Ventilateur

Moniteur Boîte Souris Clavier

Ordinateur

Page 38: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

38

Association et agrégation d’objets

Ex.:

class dossier_medical{

…..};class dossier_financier{

…..};class curriculum_vitae{

…..};

class description_entreprise{

…..};class personne{

protected:dossier_medical * S;dossier_financier * P;curriculum_vitae * T;description_entreprise * E;…..

};

agrégation

association

Note : Les objets membres se construisent selon l’ordre dans lequel ils sont déclaréset avant que les objets de la classe qui les renferme ne soient construits.

Page 39: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

39

Association et agrégation d’objets

Exemple: class Date // Deitel et Deitel, chap. 7{

private : int jour;int mois;int annee;int verifierJour(int J); // Utilitaire pour tester le

// le nombre de jours.public : Date(int J = 1, int M = 1, int A = 1900);

void affichage() const; // format jour/mois/annéeDate(); // fourni pour confirmer

// l’ordre de destruction};

Page 40: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

40

Association et agrégation d’objets

Exemple:….Date::Date(int jr, int ms, int an){

if (ms > 0 && ms <= 12) mois = ms;else { mois = 1;

cout << "Mois " << ms << " non valide. Ajuster au mois 1."   << endl; }

annee = an;jour = verifierJour(jr);cout << " Constructeur de la classe Date ";affichage();cout << endl;

}void Date::affichage() const{ cout << jour << "/" << mois << "/" << annee; }

Ne nécessite pas d’argumentscar elle contient un pointeurimplicite this.

Page 41: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

41

Association et agrégation d’objetsExemple:

Date::~Date(){

cout << "Destructeur de la classe Date ";affichage();cout << endl;

}int Date::verifierJour(int testJour){

static const int joursParMois[13] ={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

if (testJour > 0 && testJour <= joursParMois[mois]) return testJour;if (mois == 2 && testJour == 29 &&

( annee % 400 == 0 || (annee % 4 == 0 && annee % 100 != 0)))return testJour;

cout << "Jour " << testJour << " non valide. Ajuster au jour 1."   << endl;return 1; }

Page 42: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

42

Association et agrégation d’objetsExemple:

…..class Employe{

private : char prenom[25];char nomFamille[25];const Date dateNaissance;const Date dateEmbauche;

public : Employe(char * pnom, char * nomf, int moisn, int journ, int anneen,int moise, int joure, int anneee );

void affichage() const;~Employe(); // fourni pour confirmer l’ordre de

// destruction.};

Page 43: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

43

Association et agrégation d’objetsExemple:

…..Employe::Employe (char * pnom, char * nomf, int moisn, int journ, int anneen,

int moise, int joure, int anneee ): dateNaissance(journ, moisn, anneen), // Initialisation des membres dateEmbauche(joure, moise, anneee) // Passage des paramètres au

{ // constructeur de la classe Date.// Copie de pnom dans prenom.int longueur = strlen(pnom);longueur = ( longueur < 25 ? longueur: 24 );strncpy(prenom, pnom, longueur);prenom[ longueur ] = "\0";// Copie de nomf dans nomFamille.…..cout << "Constructeur de l’objet Employe: "

<< prenom << "  " << nomFamille << endl;}

Obligatoirecar

de constructeurpar défaut

pour laclasse Date

Page 44: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

44

Association et agrégation d’objetsExemple:

void Employe::affichage() const{

cout << nomFamille << ",  " << prenom << "\nEmbauché: ";dateEmbauche.affichage();cout << " Date de naissance: ";dateNaissance.affichage();cout << endl;

}

Employe::~Employe(){

cout << "Destructeur de l’objet Employe: "  << nomFamille << ",  " << prenom << endl;

}

Utilisation des fonctionnalitésde la classe Date.

Page 45: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

45

Association et agrégation d’objetsExemple:

….void main(){

Employe e( "Bob" , "Binet" , 24, 7, 1949, 12, 3, 1988 );cout << "\n" ;e.affichage();

cout << "\nTest du constructeur Date avec valeurs non valides: \n";Date d(35, 14, 1994); // valeurs de Date non valides.cout << endl;

}

Page 46: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

46

Association et agrégationd’objetsAffichage:

Constructeur de la classe Date 24/7/1949Constructeur de la classe Date 12/3/1988Constructeur de l’objet Employe: Bob Binet

Binet, BobEmbauché: 12/3/1988 Date de naissance: 24/7/1949

Test du constructeur Date avec valeurs non valides:Mois 14 non valide. Ajuster au mois 1.Jour 35 non valide. Ajuster au jour 1.Constructeur de la classe Date 1/1/1994

Destructeur de la classe Date 1/1/1994Destructeur de l’objet Employe: Binet, BobDestructeur de la classe Date 12/3/1988Destructeur de la classe Date 24/7/1949

Les objets sont construitsà l’envers.

Les objets sont détruitsdans l’ordre inversede leur construction.

Page 47: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

47

Relation d’héritage

L’héritage permet de partager les similitudes entre les classes tout en préservantleurs différences.

Les méthodes et les attributs de la super-classe sont partagés avec toutes lessous-classes.

Pompe centrifuge Pompe à diaphragme Pompe à ventouse

Pompe Échangeur de chaleur Réservoir

ÉquipementEx. : (Yves Roy)

Page 48: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

48

Relation d’héritage : quand l’utiliser ?

Ne pas oublier que l’héritage est une relation de « est un ».

Si on a une relation de « a un », on utilise l’agrégation.

Ex. : Un triangle est un polygone.

Une voiture a des pneus; une voiture est un véhicule.

Lorsqu’une classe dérivée n’hérite de rien, c’est mauvais signe.

Page 49: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 49

Classe "Objet_2D"Classe "Objet_2D"

Objet_2D

Caracteristiques_physiques Polygone_2Dagrégation

Page 50: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 50

Classe "Objet_2D"Classe "Objet_2D"#include "Polygone_2D.h"#include "Caracteristiques_physiques.h"

class Objet_2D{

protected:Polygone_2D * pPolygone_2D;Caracteristiques_physiques *pCaracteristiques_physiques;int repere_x;int repere_y;

Page 51: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 51

Classe "Objet_2D"Classe "Objet_2D"public:

Objet_2D(Polygone_2D * P, Caracteristiques_physiques * C,int x, int y);

/* Permet de créer un objet 2D avec sa forme géométrique,ses caractéristiques physiques, et un repère x, y.Pré - Nil.Post - Un objet 2D est créé. */

void Modifier_Polygone_2D(Polygone_2D * P);/* Permet de modifier la forme géométrique de l'objet.

Pré - L'objet 2D a été créé.Post - La forme géométrique de l'objet est donnée par P*/

Page 52: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 52

Classe "Objet_2D"Classe "Objet_2D"void Modifier_Caracteristiques_physiques

(Caracteristiques_physiques * CP);/* Permet de modifier les caractéristiques physiques de l'objet.

Pré - L'objet 2D a été créé.Post - Les caractéristiques physiques de l'objet sont données

par CP. */

Polygone_2D * Acces_Polygone_2D();/* Retourne la forme géométrique de l'objet.

Pré - L'objet 2D a été créé.Post - La forme géométrique de l'objet est retournée. */

Page 53: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 53

Classe "Objet_2D"Classe "Objet_2D"Caracteristiques_physiques * Acces_Caracteristiques_physiques();/* Retourne les caractéristiques physiques de l'objet.

Pré - L'objet 2D a été créé.Post - Les caractéristiques physiques de l'objet sont retournées.*/

void Modifier_repere(int x, int y);/* Permet de modifier le repère de l'objet 2D.

Pré - L'objet 2D a été créé.Post - Le repère de l'objet est maintenant x, y. */

void Donner_repere(int * x, int * y);/* Retourne en paramètre le repère de l'objet.

Pré - L'objet 2D a été créé.Post - Le repère de l'objet est retourné. */

};

Page 54: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 54

Classe "Objet_2D"Classe "Objet_2D"#include "Objet_2D.h"Objet_2D::Objet_2D(Polygone_2D * P,

Caracteristiques_physiques * C, int x, int y){

pCaracteristiques_physiques = C;pPolygone_2D = P;repere_x = x;repere_y = y;

}void Objet_2D::Modifier_Polygone_2D(Polygone_2D * P){

pPolygone_2D = P;}

Page 55: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 55

Classe "Objet_2D"Classe "Objet_2D"void Objet_2D::Modifier_Caracteristiques_physiques

(Caracteristiques_physiques * CP){

pCaracteristiques_physiques = CP;}Polygone_2D * Objet_2D::Acces_Polygone_2D(){

return pPolygone_2D;}Caracteristiques_physiques * Objet_2D

::Acces_Caracteristiques_physiques(){

return pCaracteristiques_physiques;}

Page 56: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 56

Classe "Objet_2D"Classe "Objet_2D"

void Objet_2D::Modifier_repere(int x, int y){

repere_x = x;repere_y = y;

}

void Objet_2D::Donner_repere(int * x, int * y){

*x = repere_x;*y = repere_y;

}

Page 57: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 57

Classe "Objet_2D"Classe "Objet_2D"#include <iostream.h>#include "Objet_2D.h"void main(){

int x, y;Polygone_2D * P; P = new Polygone_2D;Caracteristiques_physiques *C = new Caracteristiques_physiques;Polygone_2D * R; Caracteristiques_physiques * S;P -> Ajouter_sommet(1, 1); P -> Ajouter_sommet(1, 3);P -> Ajouter_sommet(2, 3); P -> Ajouter_sommet(2, 2);P -> Ajouter_sommet(3, 2); P -> Ajouter_sommet(3, 3);P -> Ajouter_sommet(4, 3); P -> Ajouter_sommet(4, 1);

Page 58: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 58

Classe "Objet_2D"Classe "Objet_2D"C -> Init_couleur_remplissage(2); C -> Init_couleur_contour(3);Objet_2D Q(P, C, 1, 2);

Q.Donner_repere(&x, &y);cout << "Repere : " << x << " " << y;

R = Q.Acces_Polygone_2D();cout << "Nombre de sommets : " <<R ->Nombre_de_sommets();

S = Q.Acces_Caracteristiques_physiques();cout << "Couleur de contour: " <<S ->Donner_couleur_contour();

}

Page 59: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 59

Classe autoréférentielleClasse autoréférentielle

#include <iostream.h>#include <string.h>

// Classe autoréférentielle : classe contenant un pointeur membre qui pointe// vers un objet du même type de classe.

class element {};

class pile{/* Spécification fonctionnelle de la classe " pile ".

Éléments : Chaque sommet de la pile renferme l'adresse d'un élémentet non pas l'élément lui-même où le type de chaque élémentest une classe dérivée de la classe de base "element".

Structure : Les éléments sont reliés entre eux permettant dedéterminer l'ordre d'arrivée des éléments dans la pile. */

Page 60: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 60

Classe autoréférentielleClasse autoréférentielleprivate:class Sommet{

public: element * pDonnee; // Pointeur vers une donnée.Sommet * pSommet_suivant; // Pointeur vers le sommet suivant

// dans la structure dynamique.public:

Sommet(element * pElement);/* Post - Un nouveau sommet est créé renfermant un pointeur vers

une donnée (pElement) sans posséder de sommet suivant.

*/

element * obtenirDonnee() const;/* Post - Retourne un pointeur vers une donnée. */

};Sommet * pPremier; // Pointeur vers le premier sommet de la pile.

// Met en relief les propriétés d’une structure de données.

Classe localeDonne accès directement auxdonnées membres.

NULLelement

Page 61: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 61

Classe autoréférentielleClasse autoréférentielleLa spécification de la classe pile demeure inchangée.

La spécification et l’implantation de la classe dossierainsi que le programme d’application demeurent inchangés.

Implantation de la classe locale Sommet :

pile::Sommet::Sommet(element * pElement) :pDonnee( pElement), pSommet_suivant( NULL )

{ }

element * pile::Sommet::obtenirDonnee() const{

return pDonnee;}

Page 62: Chapitre VIII Structures dobjets. Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage

Chapitre VIII - Structures d'objets 62

Classe autoréférentielleClasse autoréférentielleImplantation de la classe pile :

pile::pile() :pPremier(NULL) { }

void pile::Inserer(element * pElement){

Sommet * ptr = new Sommet( pElement);(ptr -> Sommet::pSommet_suivant) = pPremier;pPremier = ptr;

}

element * pile::Enlever(){

element * pElem = pPremier -> obtenirDonnee();Sommet * pSom = pPremier;pPremier = pPremier -> pSommet_suivant;delete pSom;return pElem;

} /* etc. */

pElement NULL

ptr

pElement pPremier