Chapitre VIII Structures dobjets
Chapitre VIII - Structures d'objets2 Structures d objets Il existe plusieurs relations entre les classes. Lhéritage nest pas la seule technique permettant de relier 2 classes. Dautres possibilités: les classes internes: classes à lintérieur dune autre classe limite la portée dutilisation les associations dobjets les agrégations dobjets: un objet est défini à partir dun ou plusieurs objets (objets composites) On peut aussi gérer une collection dobjets: tableaux dobjets, listes dobjets, etc.
Chapitre VIII - Structures d'objets3 Tableaux statiques dobjets Syntaxe Ex.Objet_2D Ensemble_objets[20]; nom dune classe 3 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 un constructeur sans argument car, le constructeur de la classe sera appelé pour chacun de 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();
Chapitre VIII - Structures d'objets4 Tableaux statiques de pointeurs dobjets Pour définir un tableau qui soit capable de gérer des objets appartenant à plusieurs classes, vous devrez stocker dans ce tableau non pas des objets, mais des pointeurs dobjets. Si le type du pointeur correspond à un pointeur de la classe de base, ce tableau pourra contenir les adresses de nimporte quel objet dérivé de cette classe. On dispose alors dun seul et même tableau pouvant stocker les adresses dobjets différents. On doit nous-même créer dynamiquement ces objets et stocker leurs adresses dans le tableau (opérateur new). Pour simplifier la gestion dun tableau de pointeurs dobjets, il est conseillé de définir une classe spécialisée dans ce domaine. On peut ainsi centraliser tous les traitements liés à la gestion du tableau.
Chapitre VIII - Structures d'objets5 Tableaux statiques de pointeurs dobjets 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];
Chapitre VIII - Structures d'objets6 Tableaux statiques de pointeurs dobjets 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.*/
Chapitre VIII - Structures d'objets7 Tableaux statiques de pointeurs dobjets 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 0 est retournée. Pré -Nil Post -Retourne la position d'un espace disponible.0 autrement.*/
Chapitre VIII - Structures d'objets8 Tableaux statiques de pointeurs dobjets int Nb_elements_presents(); /*Retourne le nombre d'objets présents dans le tableau. Pré -Nil Post -Retourne le nombre de pointeurs d'objets présents dans le tableau.*/ };
Chapitre VIII - Structures d'objets9 Tableaux statiques de pointeurs dobjets #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; }
Chapitre VIII - Structures d'objets10 Tableaux statiques de pointeurs dobjets 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; }
Chapitre VIII - Structures d'objets11 Tableaux statiques de pointeurs dobjets int Tableau_statique_de_pointeurs::Nb_elements_presents() { return Nombre_elements_presents; } #include #include "Tableau_statique_de_pointeurs.h" class dossier_medical: public classe_de_base { // };
Chapitre VIII - Structures d'objets12 Tableaux statiques de pointeurs dobjets 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(); }
Chapitre VIII - Structures d'objets13 Tableaux dynamiques de pointeurs dobjets Tableaux dont le nombre déléments peut être fixé à lexé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 ladresse du premier élément du tableau. Un tableau dynamique doit être explicitement détruit. delete [] pointeur; Cette syntaxe est obligatoire pour libérer toute lespace mémoire.
Chapitre VIII - Structures d'objets14 Tableaux dynamiques de pointeurs dobjets 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)
Chapitre VIII - Structures d'objets15 Tableaux dynamiques de pointeurs dobjets 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;
Chapitre VIII - Structures d'objets16 Tableaux dynamiques de pointeurs dobjets 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 nombre dé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.*/
Chapitre VIII - Structures d'objets17 Tableaux dynamiques de pointeurs dobjets 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 0 est retournée. Pré -Nil Post -Retourne la position d'un espace disponible.0 autrement.*/
Chapitre VIII - Structures d'objets18 Tableaux dynamiques de pointeurs dobjets int Nb_elements_presents(); /*Retourne le nombre d'objets présents dans le tableau. Pré -Nil Post -Retourne le nombre de pointeurs d'objets présents dans le tableau.*/ };
Chapitre VIII - Structures d'objets19 Tableaux dynamiques de pointeurs dobjets #include "Tableau_dynamique_de_pointeurs.h" #include 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; }
Chapitre VIII - Structures d'objets20 Tableaux dynamiques de pointeurs dobjets 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; }
Chapitre VIII - Structures d'objets21 Tableaux dynamiques de pointeurs dobjets 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; }
Chapitre VIII - Structures d'objets22 Tableaux dynamiques de pointeurs dobjets #include #include "Tableau_dynamique_de_pointeurs.h" class dossier_medical: public Classe_de_base { // };
Chapitre VIII - Structures d'objets23 Tableaux dynamiques de pointeurs dobjets 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(); }
Chapitre VIII - Structures d'objets24 Listes chaînées Liste_simple Pile File Monceau etc. d "element " s On peut créer des structures dobjets dérivés de la classe "element ".
Chapitre VIII - Structures d'objets25 Classes internes ou imbriquées Permet de définir une classe à lintérieur de la déclaration dune autre classe. Permet de réduire lutilisation 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
Chapitre VIII - Structures d'objets26 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.*/ };
Chapitre VIII - Structures d'objets27 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 lauto.*/ }; On fait toujours référence à la classe par son nom complet.
Chapitre VIII - Structures d'objets28 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.*/
Chapitre VIII - Structures d'objets29 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.*/ };
Chapitre VIII - Structures d'objets30 Classes internes #include #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 à la classe par son nom complet.
Chapitre VIII - Structures d'objets31 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); }
Chapitre VIII - Structures d'objets32 Classes internes #include #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();
Chapitre VIII - Structures d'objets33 Classes internes /*La classe Moteur n'est pas accessible à cause de l'étiquette protected. Même si nous avions l'étiquette public, les fonctions Init_Duree_de_vie et Acces_Duree_de_vie ne seraient pas disponibles à 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_vie devraient 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 construire une classe Iterator dans chaque structure de données.
Chapitre VIII - Structures d'objets34 Association et agrégation dobjets En dehors de lhéritage, il existe dautres types de relation entre les classes. Association -La relation entre les classes qui est la plus générale mais aussi la plus faible. Ex.: Une liste chaînée où chaque objet dispose dun lien vers lobjet suivant. -Permet à un objet de posséder un lien vers un autre objet mais, aucun ne fait partie de lautre. -Habituellement, une donnée membre de type pointeur vers lobjet associé.
Chapitre VIII - Structures d'objets35 Association et agrégation dobjets Association Employé Département Compagnie Directeur dirige travaille fait partie
Chapitre VIII - Structures d'objets36 Association et agrégation dobjets Agrégation -Correspond à la définition dun objet composite i.e. un objet créé à partir de plusieurs autres de classes distinctes. On représente des composantes faisant partie dun tout. -Alternative à lutilisation de lhéritage. Héritage et agrégation ont en com- mun le fait de créer automatiquement un objet à partir dune autre classe. relation composante / structure DocumentParagraphePhrase Le document est composé de paragraphes qui sont à leur tour composés de phrases. Relation transitive.
Chapitre VIII - Structures d'objets37 Association et agrégation dobjets Carte mèreProcesseurMémoire RAM Agrégation Ventilateur MoniteurBoîteSourisClavier Ordinateur
38 Association et agrégation dobjets 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 lordre dans lequel ils sont déclarés et avant que les objets de la classe qui les renferme ne soient construits.
39 Association et agrégation dobjets 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ée Date();// fourni pour confirmer // lordre de destruction };
40 Association et agrégation dobjets 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 darguments car elle contient un pointeur implicite this.
41 Association et agrégation dobjets Exemple: 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;}
42 Association et agrégation dobjets Exemple: ….. 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 lordre de // destruction. };
43 Association et agrégation dobjets Exemple: ….. 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 lobjet Employe: " << prenom << " " << nomFamille << endl; } Obligatoire car de constructeur par défaut pour la classe Date
44 Association et agrégation dobjets Exemple: void Employe::affichage() const { cout << nomFamille << ", " << prenom << "\nEmbauché: "; dateEmbauche.affichage(); cout << " Date de naissance: "; dateNaissance.affichage(); cout << endl; } Employe::~Employe() { cout<< "Destructeur de lobjet Employe: " << nomFamille << ", " << prenom << endl; } Utilisation des fonctionnalités de la classe Date.
45 Association et agrégation dobjets Exemple: …. 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; }
46 Association et agrégation dobjets Affichage: Constructeur de la classe Date 24/7/1949 Constructeur de la classe Date 12/3/1988 Constructeur de lobjet Employe: Bob Binet Binet, Bob Embauché: 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/1994 Destructeur de lobjet Employe: Binet, Bob Destructeur de la classe Date 12/3/1988 Destructeur de la classe Date 24/7/1949 Les objets sont construits à lenvers. Les objets sont détruits dans lordre inverse de leur construction.
47 Relation dhéritage Lhéritage permet de partager les similitudes entre les classes tout en préservant leurs différences. Les méthodes et les attributs de la super-classe sont partagés avec toutes les sous-classes. Pompe centrifugePompe à diaphragmePompe à ventouse PompeÉchangeur de chaleurRéservoir Équipement Ex. : (Yves Roy)
48 Relation dhéritage : quand lutiliser ? Ne pas oublier que lhéritage est une relation de « est un ». Si on a une relation de « a un », on utilise lagrégation. Ex. : Un triangle est un polygone. Une voiture a des pneus; une voiture est un véhicule. Lorsquune classe dérivée nhérite de rien, cest mauvais signe.
Chapitre VIII - Structures d'objets49 Classe "Objet_2D" Objet_2D Caracteristiques_physiquesPolygone_2D agrégation
Chapitre VIII - Structures d'objets50 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;
Chapitre VIII - Structures d'objets51 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*/
Chapitre VIII - Structures d'objets52 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.*/
Chapitre VIII - Structures d'objets53 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é.*/ };
Chapitre VIII - Structures d'objets54 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; }
Chapitre VIII - Structures d'objets55 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; }
Chapitre VIII - Structures d'objets56 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; }
Chapitre VIII - Structures d'objets57 Classe "Objet_2D" #include #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);
Chapitre VIII - Structures d'objets58 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(); S = Q.Acces_Caracteristiques_physiques(); cout Donner_couleur_contour(); }
Chapitre VIII - Structures d'objets59 Classe autoréférentielle #include //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ément et non pas l'élément lui-même où le type de chaque élément est une classe dérivée de la classe de base "element". Structure :Les éléments sont reliés entre eux permettant de déterminer l'ordre d'arrivée des éléments dans la pile. */
Chapitre VIII - Structures d'objets60 Classe autoréférentielle private: 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 dune structure de données. Classe locale Donne accès directement aux données membres. NULL element
Chapitre VIII - Structures d'objets61 Classe autoréférentielle La spécification de la classe pile demeure inchangée. La spécification et limplantation de la classe dossier ainsi que le programme dapplication 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; }
Chapitre VIII - Structures d'objets62 Classe autoréférentielle Implantation 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 pElementpPremier