46
1 P Programmation O Orientée O Objet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs (LASC)

UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

  • Upload
    lekien

  • View
    217

  • Download
    0

Embed Size (px)

Citation preview

Page 1: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

1

PProgrammation OOrientée OObjet (POO)

UNIVERSITE de METZ

Olivier HABERTMaître de Conférences

Laboratoire d'Automatique des

Systèmes Coopératifs (LASC)

Page 2: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

2

PProgrammation OOrientée OObjet (POO)

Qu'est ce qu’un Programme OOrientée OObjet ?– Ensemble d'objets autonomes et responsables qui

s'entraident pour résoudre un problème final en s'envoyant des messages.

Objet 1

Objet 2

Objet 3

Message

Page 3: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

3

PProgrammation OOrientée OObjet

Qu’est ce qu’un objet– Objet = Données + Méthodes (Fonctions Membres)

DONNEES

Fonction 1 Fonction 2

Fonction3

Fonction 4Fonction 5

Fonction 6

Page 4: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

4

PProgrammation OOrientée OObjet

Exemple d’un objet

R P

SetValueR SetValueP

GetValueR

GetValueP

Résistance

GetRmax

GetRmin

Page 5: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

5

PProgrammation OOrientée OObjet

Encapsulation des données– L’accès aux données des objets est réglementé

• Données privées accès uniquement par les fonctions membres• Données publiques accès direct par l’instance de l’objet

– Conséquences• Un objet n’est vu que par ses spécifications• Une modification interne est sans effet pour le fonctionnement

général du programme• Meilleure réutilisation de l’objet

– Exemple de la résistance• Les données R et P ne peuvent être utilisées que par les fonctions

membres

Page 6: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

6

PProgrammation OOrientée OObjet

Polymorphisme (du Grecque plusieurs formes)– Un nom (de fonction, d’opérateur) peut être associé à plusieurs

mais différentes utilisations– Exemple

• Si a est un nombre complexe, sqrt(a) appellera si elle existe la fonction adaptée au type de a.

• Dans un langage non OO, il aurait fallu connaître le nom de deuxfonctions distinctes (selon que a soit complexe ou réel)

• C’est le système qui choisit selon le type de l’argument ou de l’opérande

Page 7: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

7

PProgrammation OOrientée OObjet

L’Héritage– Permet de définir les bases d’un nouvel objet à partir

d’un objet existant– Le nouvel objet hérite des propriétés de l’ancêtre et

peut recevoir de nouvelles fonctionnalitésAvantages– Meilleures réutilisations des réalisations antérieures

parfaitement au point

Page 8: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

8

PProgrammation OOrientée OObjet

Concept de Classe– Type réunissant une description

• D’une collection de données membres hétérogènes ayant un lien entres elles

• D’une collection de méthodes (fonctions membres) servant à manipuler les données membres

– Généralisation du type structurestructure ou recordrecord des langages non OOOO (classe = définition de données + définition de méthodes)

– Possibilité de fixer la visibilité externe des différents constituants de la classe

Page 9: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

9

PProgrammation OOrientée OObjet

Instance d’une classe– C’est un objet initialisé à partir de la description figée

d’une classeFonctions membres publiques– Les constructeurs– Les destructeurs– Les accesseurs– Les modificateurs

Page 10: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

10

PProgrammation OOrientée OObjet

Les Constructeurs– Permettent d’initialiser l’objets lors de sa création

• copie des arguments vers les données membres• initialisation de variables dynamiques à la création de l’objet

– Sont appelés de manière automatique à la création de l’objet– Peuvent être surchargés On peut en définir plusieurs de

même nom mais acceptant des arguments différents– Possèdent le même nom que la classe

Page 11: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

11

PProgrammation OOrientée OObjet

Le Destructeur– Il est unique– Est appelé automatiquement lors de la destruction de

l’objet– Sert généralement à éliminer les variables dynamiques

de l’objet (créées en général par le constructeur)– Il a pour nom le nom de la classe précédé du symbole

~

Page 12: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

12

PProgrammation OOrientée OObjet

Les Accesseurs– Catégorie de fonctions membres qui permettent l’accès

et l’utilisation des informations privées contenues dans l’objet

Les Modificateurs– Permettent de modifier l’état des données internes

(publiques ou privées) de l’objet

Page 13: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

13

PProgrammation OOrientée OObjet

Définition d’une Classe en C++

class nom_classe{

private:Déclaration des données privées et des fonctions membres Déclaration des données privées et des fonctions membres

privéesprivéespublic:

Déclaration des données publiques et des fonctions Déclaration des données publiques et des fonctions membres publiquesmembres publiques

};

Page 14: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

14

PProgrammation OOrientée OObjet

Exempleclass BouteilleBiere{

private:char NomBiere[30];char couleur[30];float contenance;float TitreAlcool;int NBBPES;

public:BouteilleBiere(char *, char *, float,float,int);BouteilleBiere(char *,float);float GetContenance();int GetNBBPES();

};

Page 15: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

15

PProgrammation OOrientée OObjet

Ecriture des fonctions membres en C++Type de l’argument nom de la classe :: nom de la fonction (arguments)

Exemplefloat BouteilleBiere::GetContenance(){

return contenance;}

BouteilleBiere::BouteilleBiere(char *name, char *color, float c,float t,int n){

strcpy(NomBierre,name);strcpy(couleur,color);contenance = c;TitreAlcool = t;NBBPES = n;

}

Page 16: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

16

PProgrammation OOrientée OObjet

Création d’un objet statique en C++– nom de la classe nom de l’objet(arguments);– Exemple:

BouteilleBiere MaBouteille("1664","blonde",33.0,6.5,20);

Création d’un objet dynamique en C++– pointeur vers classe = new nom de la classe(argument)– Exemple:

BouteilleBiere* Mabouteille;Mabouteille = new BouteilleBiere("Kro","brune",25.0,5.5,30);delete Mabouteille;

Page 17: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

17

PProgrammation OOrientée OObjet

Accès aux fonctions membres d’un objet en C++– Si l’objet est représenté par une variable

• Nom_Variable.Nom fonction;• Exemple:

– Mabouteille.GetContenance();

– Si l’objet est représenté par un pointeur• Nom_pointeur Nom fonction;• Exemple:

– pMabouteille GetContenance();

Page 18: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

18

PProgrammation OOrientée OObjet

Programme completBouteilleBiere::BouteilleBiere(char *name, char *color, float c,float t,int n){

strcpy(NomBierre,name);strcpy(couleur,color);contenance = c;TitreAlcool = t;NBBPES = n;

}

BouteilleBiere::BouteilleBiere(char *name,float c){

strcpy(NomBierre,name);strcpy(couleur,"BLONDE");contenance = 33.0;TitreAlcool = c;NBBPES = 20;

}

main(){

BouteilleBiere* Mabouteille;Mabouteille = new BouteilleBiere("Kro","brune",25.0,5.5,30);cout << Mabouteille GetContenance();delete Mabouteille;

}

#include <iostream.h>#include <string.h>class BouteilleBiere{

private:char NomBiere[30];char couleur[30];float contenance;float TitreAlcool;int NBBPES;

public:BouteilleBiere(char *, char *, float,float,int);BouteilleBiere(char *,float);float GetContenance();int GetNBBPES();

};float BouteilleBiere::GetContenance(){

return contenance;}

int BouteilleBiere::GetNBBPES(){

return NBBPES;} 25

Page 19: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

19

PProgrammation OOrientée OObjetProgramme complet avec destructeur

BouteilleBiere::BouteilleBiere(char *name, char *color, float c,float t,int n){

strcpy(NomBierre,name);strcpy(couleur,color);contenance = c;TitreAlcool = t;NBBPES = n;

}

BouteilleBiere::BouteilleBiere(char *name,float c){

strcpy(NomBierre,name); strcpy(couleur,"BLONDE");contenance = 33.0; TitreAlcool = c;NBBPES = 20;

}

BouteilleBiere::~BouteilleBiere(){

cout <<"c'est fini !!"<<'\n';}

main(){

BouteilleBiere* Mabouteille;Mabouteille = new BouteilleBiere("Kro","brune",25.0,5.5,30);cout << Mabouteille GetContenance();delete Mabouteille;

}

#include <iostream.h>#include <string.h>class BouteilleBiere{

private:char NomBiere[30];char couleur[30];float contenance;float TitreAlcool;int NBBPES;

public:BouteilleBiere(char *, char *, float,float,int);BouteilleBiere(char *,float);float GetContenance();int GetNBBPES();~BouteilleBiere();

};float BouteilleBiere::GetContenance(){

return contenance;}

int BouteilleBiere::GetNBBPES(){

return NBBPES;}

25 c'est fini !!

Page 20: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

20

PProgrammation OOrientée OObjet

Héritage en C++– Spécifications Classe Dérivée = Spécifications Classe

Ancêtre + Nouvelles Spécifications– Héritage des données et des fonctions membres sauf:

• Les constructeurs et destructeurs de l'ancêtre– Introduction d'un nouveau statut: protectedprotected

• membre ne pouvant être utilisé que par les fonctions membres de la classe et de celles qui en seront dérivées

Page 21: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

21

PProgrammation OOrientée OObjet

Syntaxe d'héritageclass nom_nouvelle_classe : type héritage nom_ancêtre {…};class nom_nouvelle_classe : type héritage nom_ancêtre {…};

Exemple– On désire créer une classe BouteilleVin à partir de

BouteilleBiere

class class BouteilleVin BouteilleVin : public : public BouteilleBouteilleBierre Bierre {…}{…}

Page 22: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

22

PProgrammation OOrientée OObjet

Type d'héritage– Règles de dérivation de classe

inaccessibleinaccessibleprotectedprotected

publicpublic

privateprivateprotectedprotected

publicpublicpublicpublic

inaccessibleinaccessibleprotectedprotectedprotectedprotected

privateprivateprotectedprotected

publicpublicprotectedprotected

inaccessibleinaccessibleprivateprivateprivateprivate

privateprivateprotectedprotected

publicpublicprivateprivate

statut du membre dans la classe dérivée

statut du membre dans la classe ancêtremode de dérivation

Page 23: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

23

PProgrammation OOrientée OObjet

Conséquences des différents type de dérivation– Dérivation privée: ( mode par défaut)

• Les membres deviennent privateprivate ou inaccessible• Tous les membres seront inaccessibles à la seconde dérivation

– Dérivation publique:• Les membres gardent le même statut sauf les membres privateprivate qui

deviennent inaccessibles– Dérivation protégée:

• Tous les membres non privés deviennent de type protectedprotected, les membres privés deviennent inaccessibles

Page 24: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

24

PProgrammation OOrientée OObjet

Ajout de données et de fonctions membresclass class BouteilleVinBouteilleVin : public : public BouteilleBierreBouteilleBierre{{

public:public:BouteilleVinBouteilleVin(char *n, char *(char *n, char *coulcoul, , floatfloat c, c, floatfloat t, t, intint n, n, intint a) :a) :

BouteilleBiereBouteilleBiere(char *n, char *(char *n, char *coulcoul, , float float c, c, floatfloat t, t, intint n);n);

BouteilleVinBouteilleVin(char * nom, (char * nom, floatfloat t) : t) : BouteilleBiereBouteilleBiere(char * nom, (char * nom, floatfloat t) ;t) ;int GetAnneeint GetAnnee();();

privateprivate::int anneeint annee;;

};};

Page 25: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

25

PProgrammation OOrientée OObjet

Constructeurs et Destructeur dans les opérations d'héritages– Quand à la fois la classe de base et la classe dérivée ont des

constructeurs et des destructeurs:• Constructeurs sont exécutés dans l'ordre de la dérivation

• Destructeurs dans l'ordre inverse de la dérivation– C'est au constructeur de l'objet dérivé en dernier de passer les

arguments dont a besoin son ancêtre. (voir exemple précédent)

Page 26: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

26

PProgrammation OOrientée OObjet

Quelques exemples d'héritages#include <iostream.h>

class base {

int x;

public:

void setx(int n) {x=n;}

void showx() {cout <<x<<'\n';}

};

class derive : public base {

int y;

public:

void sety(int n) {y=n;}

void showy() {cout << y << '\n';}

void show_somme() {cout << x+y <<'\n';}

};

main()

{

derive ob;

ob.setx(10);

ob.sety(20);

ob.showx();

ob.showy();

return(0);

}

Cherchez l'erreur ?

Page 27: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

27

PProgrammation OOrientée OObjet

Quelques exemples d'héritages#include <iostream.h>

class base {

int x;

public:

void setx(int n) {x=n;}

void showx() {cout <<x<<'\n';}

};

class derive : private base {

int y;

public:

void sety(int n) {y=n;}

void showy() {cout << y << '\n';}

};

main()

{

derive ob;

ob.setx(10);

ob.sety(20);

ob.showx();

ob.showy();

return(0);

}

Cherchez l'erreur ?

Page 28: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

28

PProgrammation OOrientée OObjet

Quelques exemples d'héritages#include <iostream.h>

class base {

int x;

public:

void setx(int n) {x=n;}

void showx() {cout <<x<<'\n';}

};

class derive : private base {

int y;

public:

void setxy(int n,int m) {setx(n) ; y=m;}

void showxy() {showx(); cout << y << '\n';}

};

main()

{

derive ob;

ob.setxy(10,20);

ob.showxy();

return(0);

}

Pourquoi ça marche maintenant ?

Page 29: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

29

PProgrammation OOrientée OObjet

Quelques exemples d'héritages#include <iostream.h>

class base {

public:

base(){ cout <<"construction de la classe de base \n;}

~base(){ cout <<"destruction de la classe de base \n;}

};

class derive : public base{

public:

derive() { cout << "construction de la classe dérivée \n";}

~derive(){cout << "destruction de la classe dérivée \n";}

};

main()

{

derive o;

return(0);

}

Affichage Ecranconstruction de la classe de base construction de la classe dérivée destruction de la classe dérivée destruction de la classe de base

Page 30: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

30

PProgrammation OOrientée OObjetQuelques exemples d'héritages

#include <iostream.h>

class base {

public:

base(){ cout <<"construction de la classe de base \n;}

~base(){ cout <<"destruction de la classe de base \n;}

};

class derive : public base{

int j;

public:

derive(int n) { j = n; cout << "construction de la classe dérivée \n";}

~derive(){cout << "destruction de la classe dérivée \n";}

showj(){ cout <<j <<'\n';}

};

main(){

derive o(10);o.showj();return(0);

}

Affichage Ecranconstruction de la classe de base construction de la classe dérivée10destruction de la classe dérivée destruction de la classe de base

Page 31: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

31

PProgrammation OOrientée OObjetQuelques exemples d'héritages

#include <iostream.h>

class base {

int i;

public:

base(int n){ i=n; cout <<"construction de la classe de base \n;}

~base(){ cout <<"destruction de la classe de base \n;}

void showi(){cout <<i<<'\n';}

};

class derive : public base{

int j;

public:

derive(int n) :base(n){

j = n; cout << "construction de la classe dérivée \n";}

~derive(){cout << "destruction de la classe dérivée \n";}

showj(){ cout <<j <<'\n';}

};

main(){

derive o(10);o.showi();o.showj();return(0);

}

Affichage Ecranconstruction de la classe de base construction de la classe dérivée1010destruction de la classe dérivée destruction de la classe de base

Page 32: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

32

PProgrammation OOrientée OObjetQuelques exemples d'héritages

#include <iostream.h>class base {int i;public:

base(int n){ i=n; cout <<"construction de la classe de base \n;}~base(){ cout <<"destruction de la classe de base \n;}void showi(){cout <<i<<'\n';}

};class derive : public base{int j;public:

derive(int n,int m) :base(m){j = n; cout << "construction de la classe dérivée \n";}

~derive(){cout << "destruction de la classe dérivée \n";}showj(){ cout <<j <<'\n';}

};

main(){

derive o(10,20);o.showi();o.showj();return(0);

}

Affichage Ecranconstruction de la classe de base construction de la classe dérivée2010destruction de la classe dérivée destruction de la classe de base

Page 33: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

33

PProgrammation OOrientée OObjet

Surcharge des Fonctions– On peut définir des fonctions de même nom mais se

différentiant par le nombre et le type d'arguments– Exemple:

• float Val_Absolue(float v) {return fabs(v);}• int Val_Absolue(int v){return abs(v);}• Le système choisira la fonction à appeler selon les

arguments.

Page 34: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

34

PProgrammation OOrientée OObjet

Surcharge des opérateurs en C++– Même principe que la surcharge des fonctions

• Le fonctionnement de l'opérateur s'effectue en fonction du nombre et du type des opérandes

• La surcharge d'un opérateur doit obligatoirement s'associer à une classe

Page 35: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

35

Surcharge des opérateurs en C++– Exemple:

#include <iostream.h>class point {public:

int x,y;point(){x=0;y=0;}point(int i,int j) {x=i;y=j;}point operator+(point p2);

};point point::operator+(point p2){

point temp;temp.x = x + p2.x;temp.y = y + p2.y;return temp;

}

main(){

point p1(10,10),p2(5,3),p3;p3 = p1 + p2;cout << p3.x <<< p3.y <<'\n';

}

PProgrammation OOrientée OObjet

Page 36: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

36

PProgrammation OOrientée OObjet

Passage de paramètres par référence en C++– Idem dans les spécifications au passage par pointeurs mais

évite leurs lourdeurs d'écriture– Exemple:

• Passage par pointeur:void permutter ( int *a, int *b) {int temp = *a; *a =*b;*b =temp;}main(){ int a=8;int b=7; permutter(&a,&b);}

• Passage par référence:void permutter (int &a, int &b) {int temp = a;a = b; b = temp;}main() {int a=8;int b=7;permutter(a,b);}

Page 37: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

37

PProgrammation GGraphique sous WWindows

Programmation avec les API (Application Programming Interface)– Que sont les API

• Ensemble d'interfaces pour accéder à la fonctionnalité des services de bas niveau (gestion des périphériques, du système, du réseau,…)

• Implantées sous forme de librairie (DLL)

Page 38: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

38

//useful defines#define STRICT#define WIN32_LEAN_AND_MEAN#include <windows.h>#include "resource.h"

//entry point for a windows programint WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);//main window callback functionLRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);

// GLOBAL VARIABLESconst char* pClassName="TTWin32Generic";HINSTANCE hMainInst=0; //instance of the applicationHWND hMainWnd=0; //handle to main window of the application//various variables used with virtual windowHDC memdc=0;HBITMAP hbit=0;HBRUSH hbrush=0;HPEN hpen, hOldPen;RECT rClient;int MaxX=0, MaxY=0;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgs,int nWinMode)

{//create a window class by filling in a WNDCLASSEX structureWNDCLASSEX WinClass;WinClass.cbSize=sizeof(WNDCLASSEX); //size of the structureWinClass.hInstance=hInstance; //instance of the applicationhMainInst=hInstance;WinClass.lpszClassName=pClassName; //window class nameWinClass.lpfnWndProc=WindowFunc; //callback function WinClass.style=CS_HREDRAW | CS_VREDRAW;//load default application icon//WinClass.hIcon=LoadIcon(NULL, IDI_APPLICATION);//load standard (32 x 32) iconWinClass.hIcon=LoadIcon(hInstance,

MAKEINTRESOURCE(IDI_BIG));//load small (16 x 16) icon//if specified then it is used on the taskbar and in the system menu//otherwise 32 x 32 icon is scaled to 16 x 16 by Windows//WinClass.hIconSm=LoadIcon(hInstance,

MAKEINTRESOURCE(IDI_SMALL));WinClass.hIconSm=0;//load cursorWinClass.hCursor=LoadCursor(NULL, IDC_ARROW);//here we can specify a menu handleWinClass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU);WinClass.cbClsExtra=0;WinClass.cbWndExtra=0;

WinClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//register window class we just createdif(!RegisterClassEx(&WinClass))return 0; //registration failed

HWND hwnd=CreateWindow(pClassName,"Generic Windows 95

application", WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,HWND_DESKTOP,NULL,hInstance,NULL);

if(!hwnd) //window creation failedreturn 0;

hMainWnd=hwnd;//show windowShowWindow(hwnd, nWinMode);//force a repaintUpdateWindow(hwnd);MSG WinMsg;

//start message pumpwhile(GetMessage(&WinMsg, NULL, 0, 0)){TranslateMessage(&WinMsg);DispatchMessage(&WinMsg);

}return WinMsg.wParam;

}

Création de la classe de la fenêtre

Création de la FenêtrePrototype de Fonctions

et Variables Globales

Page 39: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

39

LRESULT CALLBACK WindowFunc(HWND hwnd, UINT Msg,

WPARAM wParam, LPARAM lParam){//device context for drawingHDC hdc=0;switch(Msg){case WM_CREATE:{//get height and width of the screenMaxX=GetSystemMetrics(SM_CXSCREEN);MaxY=GetSystemMetrics(SM_CYSCREEN);//get device contexthdc=GetDC(hwnd);//create compatible device context to memorymemdc=CreateCompatibleDC(hdc);hbit=CreateCompatibleBitmap(hdc, MaxX, MaxY);SelectObject(memdc, hbit);hpen=CreatePen(PS_SOLID, 1, RGB(0, 0, 0));hOldPen=(HPEN)SelectObject(memdc, hpen);//if we did not set window background//while registering window class then//we need following two lines

hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH);SelectObject(memdc, hbrush);PatBlt(memdc, 0, 0, MaxX, MaxY, PATCOPY);ReleaseDC(hwnd, hdc);break;

}

//this message is sent when a window needs to//be repaintedcase WM_PAINT:{PAINTSTRUCT paintstruct;//get device context for drawinghdc=BeginPaint(hwnd, &paintstruct);//paint the windowBitBlt(hdc, 0, 0, MaxX, MaxY, memdc, 0, 0, SRCCOPY);EndPaint(hwnd, &paintstruct);break;

}case WM_LBUTTONDOWN:{//if we press left mouse button...//some drawing code...RECT rClient;GetClientRect(hwnd, &rClient);for(int nCnt=0; nCnt < rClient.right; nCnt+=5){MoveToEx(memdc, nCnt, 0, (POINT*)NULL);LineTo(memdc, rClient.right-nCnt, rClient.bottom);

}//invalidate window to force a WM_PAINT messageInvalidateRect(hwnd, (const RECT*)NULL, TRUE);break;

}

//if menu item selectedcase WM_COMMAND:{WORD wID=LOWORD(wParam); //id of the

menu itemswitch(wID){case IDM_FOPEN://File->Open is disabled for nowbreak;

case IDM_EXIT:DestroyWindow(hwnd);break;

}break;

}case WM_DESTROY:

//release used resourcesSelectObject(memdc, hOldPen);DeleteObject(hpen);DeleteObject(hbit);DeleteDC(memdc);PostQuitMessage(0);break;

default: //all other messages are handled by default

return DefWindowProc(hwnd, Msg, wParam, lParam);}return 0;

}

Définition de la Procédure de Fenêtre(Réponse aux différents messages)

Page 40: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

40

PProgrammation GGraphique sous WWindows

Exécution du programme

Page 41: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

41

PProgrammation GGraphique sous WWindows

Programmation avec une bibliothèque d'objets– Exemple:

• ObjectWindows de Borland ou Microsoft Fundation Classes (MFC)

• Collection d'objets graphiques que l'on peut dériver et améliorer

Page 42: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

42

PProgrammation GGraphique sous WWindows

Exemple de Programme avec ObjectWindows#include <owl/pch.h>#include <owl/applicat.h>#include <owl/framewin.h>

class TDrawApp : public TApplication {public:

TDrawApp() : TApplication() {}

void InitMainWindow(){

SetMainWindow(new TFrameWindow(0, "Ma premiere Fenetre avec ObjectWindows"));}

};int OwlMain(int /*argc*/, char* /*argv*/ []){

TDrawApp MaFenetre;MaFenetre().Run();return 1;

}

Page 43: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

43

PProgrammation GGraphique sous WWindows

Exécution du Programme

Page 44: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

44

PProgrammation GGraphique sous WWindows

Programmation Visuelle– Avec Visual Basic, Delphi, C++ Builder

– Interface de haut qui permet de construire graphiquement l'architecture graphique d'une application

– Couche logicielle qui gère graphiquement la manipulation des objets

Page 45: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

45

PProgrammation GGraphique sous WWindows

Création d'une Application avec C++ Builder

Page 46: UNIVERSITE de METZ Olivier HABERT des Systèmes Coopératifs ... · bjet (POO) UNIVERSITE de METZ Olivier HABERT Maître de Conférences Laboratoire d'Automatique des Systèmes Coopératifs

46

PProgrammation GGraphique sous WWindows

Création d'une Application avec Visual Basic