Vous êtes sur la page 1sur 9

Objectifs

Objectifs

Synthse

Synthse

Fondamentaux

Fondamentaux

Mthode de
rvision

Mthode de
rvision

Informatique II :

Exemple concret

Exemple concret

Cours dintroduction linformatique


et la programmation objet

Objectifs du cours daujourdhui


Nous voici donc arrivs au terme de ce cours.
Lobjectif de ces quelques transparents est de vous rafrachir la
mmoire en rappelant les principaux points.
Nous avons abord :

Rvisions finales

1. Introduction lInformatique
2. Bases de programmation (procdurale)
Jamila Sam Haroud

3. Bases de programmation oriente objets


4. Quelques thmes choisi dInformatique : bases
dalgorithmique et structures de donnes

Laboratoire dIntelligence Artificielle


Facult I&C

On va se focaliser ici sur les rappels de programmation.


c EPFL 20022012

c EPFL 20022012

Jamila Sam

Jamila Sam

Informatique II Rvisions 1 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Objectifs
Synthse
Fondamentaux
Mthode de
rvision

Quavons nous vu en programmation ?


programmer cest dcomposer une tche automatiser en une
squence dinstructions (traitements) et des donnes

Exemple concret

Objectifs
Synthse

traitements

Mthode de
rvision

Algorithme
Traitements

en programmation oriente objets, on regroupe dans le mme


objet les traitements et les donnes qui lui sont spcifiques
(principe dencapsulation)

AB

TIO

Porte
Chanes de caractres
Tableaux statiques
Tableaux dynamiques
Structures
Pointeurs
Entres/Sorties

OBJET
attributs

c EPFL 20022012

Jamila Sam

mthodes

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

(vide)

Dtails d
Implmentation

S.D.A.
Donnes
Variables

Expressions & Oprateurs


Structures de contrle
Fonctions

Interface
(partie visible)

programmer cest dcomposer une tche automatiser en une


squence dinstructions (traitements) et des donnes

donnes
influencent

AC
S TR

Quavons nous vu en programmation ?

Fondamentaux

Exemple concret

oprent sur

Informatique II Rvisions 2 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

c EPFL 20022012

Jamila Sam

(partie interne/cache)
Informatique II Rvisions 3 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Informatique II Rvisions 3 / 34

Objectifs
Synthse

Quavons nous vu en programmation ?

Fondamentaux
Mthode de
rvision
Exemple concret

c EPFL 20022012

Jamila Sam

Synthse
Fondamentaux
Mthode de
rvision
Exemple concret

Synthse

en programmation oriente objets, on regroupe dans le mme


objet les traitements et les donnes qui lui sont spcifiques
(principe dencapsulation)
Objet
Encapsulation et Abstraction
Classes
Hritage simple/multiple
Polymorphisme
Classes abstraites/virtuelles
Rsolution des collisions de noms
Traitements
Donnes
Mthodes
Attributs
Constructeurs & Destructeurs
Appels aux constructeurs
Const
des attributs (hrits)
Virtuelles (pures)
Statiques
Surcharge doprateurs(interne/externe)
Privs/protgs/publiques
Hrits/cachs (::)
Informatique II Rvisions 3 / 34

fondamentaux de la POO

Mthode de
rvision
Exemple concret

2.1
2.2
2.3
2.4

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

conception (quest ce quon veut ?)


implmentation (comment a se ralise ?)
syntaxe (comment a scrit ?)
tests (o sont mes fautes, comment pourrais-je les tester ?)

c EPFL 20022012

Jamila Sam

Informatique II Rvisions 4 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Synthse

Proposition de mthode de rvision

Fondamentaux
Mthode de
rvision

class Rectangle {
public:
double surface() { ... };
...
private:
double hauteur;
double largeur;
}

Exemple concret

prendre les tableaux synthtiques des transparents 3 et 4

prendre les fiches rsum


et pour chacun des points, se demander si on sait :

3. polymorphisme le choix du type se fait lexcution, en


fonction de la nature relles des instances (typage
dynamique)
Ingrdients: Pointeurs/Rfrences + mthodes virtuelles
Informatique II Rvisions 5 / 34

de quoi a parle ?
ce que a veut dire ?
lutiliser ?

se focaliser sur les concepts.


Les dtails de syntaxe (comment a scrit) peuvent tre ensuite
rapidement retrouvs dans la fiche rsum, si on sait ce quon
cherche (cest--dire si on a le concept)

class RectangleColore : public Rectangle {


Couleur couleur;
//...};

Jamila Sam

variables
int i;
vector<double> v;
fonctions prototype
double sin(double x);
bool cherche_valeur(Listechainee l, Valeur v);
classes Attributs et prototypes des mthodes

2. modularisez / dcomposez / pensez atomique et


objet

Objectifs

1. encapsulation Objet = attributs + mthodes

1. dclarez avant dutiliser

Attributs et mthodes publiques Interface de la classe


(abstraction)
2. hritage

c EPFL 20022012

FONDAMENTAUX

Fondamentaux

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Objectifs

Objectifs

c EPFL 20022012

Jamila Sam

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Informatique II Rvisions 6 / 34

Objectifs
Synthse

Rvisions

Objectifs
Synthse

Fondamentaux

Fondamentaux

Mthode de
rvision

Mthode de
rvision

Exemple concret

Exemple concret

Un exemple concret
Reprenons lun de nos exercices de sries. Il sagit de :
dfinir une collection de figures gomtriques

polymorphisme et collections htrognes

hritage de containers (typiquement vector)


mthodes const

classes virtuelles

Une figure peut tre un cercle, un carre ou un triangle


chacune de ces formes est associe une mthode daffichage
spcifique affiche()
La collection sera implmente au moyen dune classe Dessin
La classe Dessin permettra notamment dinvoquer la bonne
fonction daffichage pour chaque figure de la collection
COMMENT FAIRE ?

c EPFL 20022012

c EPFL 20022012

Jamila Sam

Jamila Sam

Informatique II Rvisions 7 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Objectifs
Synthse
Fondamentaux
Mthode de
rvision
Exemple concret

Pensons Objet

Objectifs
Synthse

On nous demande :
dimplmenter une collection, Dessin, de figures gomtriques
Objet Figure
attributs : ? et mthodes : affiche()
afficher la description dune Figure
Objet Dessin
attribut: une collection de Figure? et
mthodes : affiche()
afficher les figures de la collection
do dj :

Informatique II Rvisions 8 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Fondamentaux
Mthode de
rvision

Affinons la description de nos classes


Commenons par la classe Figure :
cest plutt ... abstrait :

Exemple concret

des attributs concrets (rayon, cot, etc.) afficher ne sont


spcifiables que pour des figures gomtriques prcises (carre,
triangle, etc.)
de mme la mthode affiche va dpendre du type de Figure
considre
Continuons donc penser objet et atomique

class Figure {
...
void affiche () const;
...
};

il nous faut aussi dcrire des formes spcifiques de


Figures
Ici des Cercles, des Carres et des Triangles

c EPFL 20022012

Jamila Sam

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

class Dessin {
// une collection de Figures
...
void affiche () const;
};

c EPFL 20022012

Jamila Sam

Informatique II Rvisions 9 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Pour ces types dobjets, on sait concrtement quels sont les


attributs typiques et on a (au moins) une ide de comment les
afficher
Informatique II Rvisions 10 / 34

Objectifs
Synthse

Affinons la description de nos classes (2)

Objectifs
Synthse

Fondamentaux

Fondamentaux

Mthode de
rvision

Mthode de
rvision

Exemple concret

Exemple concret

La classe Cercle
Spcifions un peu plus compltement cette classe :
Tout dabord respectons les principes dune bonne encapsulation :

Exemple des Cercles :


Dfinissons proprement linterface de la classe (i.e, ce qui doit
tre visible depuis lextrieur de la classe et ce qui na pas besoin
de ltre)

class Cercle {
void affiche() const {
cout << "Un cercle de rayon " << rayon << endl;
}
double rayon;
};

class Cercle {
public: //DROIT DACCES
void affiche() const {
cout << "Un cercle de rayon " << rayon << endl;
}
private: //DROIT DACCES
double rayon;
};

c EPFL 20022012

c EPFL 20022012

Jamila Sam

Jamila Sam

Informatique II Rvisions 11 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Objectifs
Synthse

La classe Cercle (2)

Objectifs
Synthse

Fondamentaux
Mthode de
rvision
Exemple concret

Fondamentaux

Il nous faut aussi des constructeurs/destructeurs

Mthode de
rvision

class Cercle {
public:
Cercle(double x = 0.0) // CONSTRUCTEUR PAR DEFAUT
: rayon(x) {
cout << "Et hop, un cercle de plus !" << endl;
}

Exemple concret

Ce nest pas tout!


Nos Cercles sont des spcialisations possibles de Figure.
Ils seront dailleurs manipuls dans notre collection comme des
Figures quelconques (polymorphisme)

class Cercle : public Figure {


public:
Cercle(double x = 0.0)
: rayon(x) {
cout <r< "Et hop, un cercle de plus !" << endl;
}
...
private:
double rayon;
};

// pas vraiment necessaire non plus ici


~Cercle() { cout << "le dernier cercle ?" << endl; }
void affiche() const {
cout << "Un cercle de rayon " << rayon << endl;
}
private:
double rayon;
};
c EPFL 20022012

c EPFL 20022012

Jamila Sam

Jamila Sam

Informatique II Rvisions 13 / 34

La classe Cercle (3)

il faut donc que Cercle hrite de Figure :

// pas vraiment necessaire, mais pour lexemple


Cercle(const Cercle& c)
: rayon(c.rayon) {
cout << "Et encore un cercle qui fait des petits !" << endl;
}

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Informatique II Rvisions 12 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

On fait pareil pour toutes les autres types de Figures, et on


obtient ainsi les briques de base de notre implmentation
Informatique II Rvisions 14 / 34

Objectifs
Synthse
Fondamentaux
Mthode de
rvision
Exemple concret

La classe Dessin

Objectifs
Synthse

Une faon dimplmenter notre collection htrogne consiste


doter la classe Dessin dun attribut stockant ( encapsulant )
une liste de de Figures (un tableau dynamique par exemple)

Fondamentaux
Mthode de
rvision
Exemple concret

question : Est-ce la meilleure faon de procder?


Oui, si cest comme cela quon le conoit ( un dessin
a/possde une collection de figures ).
Mais une autre vision est aussi possible : un dessin est une
collection de figures

Mais regardons notre fonction affiche de la classe Dessin...

[mais attention le destructeur de vector nest pas virtuel]

Synthse

Jamila Sam

Informatique II Rvisions 15 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Objectifs

c EPFL 20022012

COMMENT FAIRE ?

Pointeurs et polymorphisme

Mthode de
rvision

Synthse

Polymorphisme : Pointeurs/Rfrences + mthodes virtuelles

Exemple concret

Deuxime ingrdient : la fonction affiche de la classe Figure


doit tre virtuelle
class Figure {
...
virtual void affiche() const; // METHODE VIRTUELLE !
...
};

class Dessin : public vector<Figure*> { // POINTEURS !!


public:
...
void affiche() const {
cout << "Je contiens :" << endl;
for (unsigned int i(0); i < size(); ++i) {
(*this)[i]->affiche();
}
}
};

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Mthodes virtuelles

Mthode de
rvision

notre classe Dessin doit donc manipuler des pointeurs sur


les instances de Figures et non pas les instances
elles-mmes !

Jamila Sam

Informatique II Rvisions 16 / 34

Fondamentaux

Exemple concret

c EPFL 20022012

On souhaite quelle invoque pour chaque (*this)[i], la


mthode daffichage approprie la nature relle de linstance
stocke.
Il est temps de se proccuper un peu de polymorphisme !

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Objectifs

Fondamentaux

class Dessin : public vector<Figure> { //HERITAGE DE VECTOR


public:
...
void affiche() const {
cout << "Je contiens :" << endl;
for (unsigned int i(0); i < size(); ++i) {
(*this)[i].affiche();
}
}
};
for (vector<Figure>::const_iterator i(begin()); i != end(); ++i)
{ i->affiche();}

On bnficie alors directement ( hrite ) des mthodes


existants pour les vector !! (constructeurs, destructeur,
push_back(), size(), etc.)

Jamila Sam

On veut donc faire hriter Dessin dune classe vecteur de


Figures :

Note : on pourrait aussi bien utiliser ici un itrateur

on fait alors hriter Dessin dune classe container (vector


par exemple)

c EPFL 20022012

Hritage dun container

Le premier ingrdient est dsormais fourni !


(mais attention aux classes contenant des pointeurs !)
Informatique II Rvisions 17 / 34

c EPFL 20022012

Jamila Sam

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Informatique II Rvisions 18 / 34

Objectifs
Synthse

Ajout dune Figure

Objectifs
Synthse

Fondamentaux

Fondamentaux

Mthode de
rvision

Mthode de
rvision

Exemple concret

Lnonc de lexercice prcise que lon veut une mthode


ajouteFigure ajoutant la collection la copie dune figure
passe en paramtre.

Ajout dune Figure (2)

Exemple concret

Une mthode copie doit donc tre fournie dans la classe


Figure :
class Figure {
public:
virtual void affiche () const;
// COPIE POLYMORPHIQUE :
virtual Figure* copie() const;
..
};

class Dessin : public vector<Figure*> {


public:
void ajouteFigure(const Figure& fig) {
push_back(fig.copie());
}
void affiche() const {
cout << "Je contiens :" << endl;
for (unsigned int i(0); i < size(); ++i) {
(*this)[i]->affiche();
}
}

copie doit aussi tre virtuelle pour les mmes raisons que
affiche

};
c EPFL 20022012

c EPFL 20022012

Jamila Sam

Jamila Sam

Informatique II Rvisions 19 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Objectifs
Synthse

La classe Figure

Informatique II Rvisions 20 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Objectifs
Synthse

Fondamentaux

Fondamentaux

Mthode de
rvision

Mthode de
rvision

Exemple concret

Exemple concret

Les mthodes de la classe Figure ont ceci de particulier que lon


sait quelles doivent exister mais quon ne sait pas exactement
comment les coder

La classe Figure
Au lieu de donner des dfinitions arbitraires affiche et copie,
il faut les dclarer comme virtuelles pures.
Elles nont alors pas de dfinition associe et la classe Figure
devient une classe abstraite
class Figure {
public:
// METHODES VIRTUELLES PURES :
virtual void affiche () const = 0;
virtual Figure* copie() const = 0;
...
};

class Figure {
public:
virtual void affiche () const { ??? }
virtual Figure* copie() const { ??? }
..
};

Ces mthodes ne seront dfinies que dans les sous-classes


concrtes de Figure
c EPFL 20022012

c EPFL 20022012

Jamila Sam

Jamila Sam

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Informatique II Rvisions 21 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Informatique II Rvisions 22 / 34

Objectifs
Synthse

Finalisation des classes

Objectifs
Synthse

Fondamentaux

Fondamentaux

Mthode de
rvision

Mthode de
rvision

Exemple concret

Exemple concret

Terminons une premire version de nos classes :


il faut fournir les dfinitions concrtes de copie dans les
sous-classes drives de Figures
Exemple :
class Cercle : public Figure {
public:
...
Cercle* copie() { return new Cercle(*this); }
};

c EPFL 20022012

c EPFL 20022012

Jamila Sam

Jamila Sam

Informatique II Rvisions 23 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Objectifs
Synthse
Fondamentaux
Mthode de
rvision
Exemple concret

Mthodes const

Synthse

Cest le cas de toutes les mthodes affiche et copie

Mthode de
rvision

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Informatique II Rvisions 25 / 34

Informatique II Rvisions 24 / 34

Classes virtuelles
Passons un autre sujet dlicat, li cette fois lhritage multiple.
Supposons que nous ayons coder une hirarchie de classes
en losange se prsentant comme suit :
A

Meilleures spcification des intentions du programmeur,


contrles syntaxiques supplmentaires possibles

Jamila Sam

Pourquoi le destructeur de Figure doit-il tre virtuel ? (voir cours


sur le polymorphisme)

Exemple concret

class Figure {
public:
virtual void affiche () const= 0; // METHODE CONST
virtual Figure* copie() const = 0;
virtual ~Figure() { cout << "Une figure de moins." << endl; }
};

c EPFL 20022012

class Dessin : public vector<Figure*> {


public:
~Dessin() {
cout << "Le dessin sefface..." << endl;
for (unsigned int i(0); i < size(); ++i) delete (*this)[i];
clear();
}
...
};
class Figure {
public:
...
virtual ~Figure() { cout << "Une figure de moins." << endl; }
};
class Cercle : public Figure {
public:
...
~Cercle() { cout << "le dernier cercle ?" << endl; }};

Fondamentaux

Exemple :

On peut ensuite amliorer souhait le codage de nos classes en


fournissant notamment des mthodes de copie profonde et des
surcharges doprateurs (dont =), surtout l o il y a des pointeurs
(Dessin).

Il faut aussi fournir des destructeurs toutes classes pour


dsallouer proprement la mmoire utilise par notre collection :

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Objectifs

Pour amliorer notre code, toutes les mthodes ne modifiant pas


les attributs de leurs classes ont t dclares comme const

Finalisation des classes (2)

Chaque instance de la classe D hrite, a priori, deux fois des


attributs et mthodes de A
c EPFL 20022012

Examinons ce qui se passe lorsque lon excute le code suivant...

Jamila Sam

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Informatique II Rvisions 26 / 34

Objectifs
Synthse

La classe A

Objectifs
Synthse

Fondamentaux

Fondamentaux

Mthode de
rvision

Mthode de
rvision

Exemple concret

Exemple concret

class A {
public:
int a;
A(int i) : a(i)
{ cout<< "Creation de A" << endl; }
virtual ~A() {cout << "Destruction de A"<<endl; }

};

c EPFL 20022012

c EPFL 20022012

Jamila Sam

Jamila Sam

Informatique II Rvisions 27 / 34

Objectifs
Synthse

La classe D

Informatique II Rvisions 28 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Objectifs
Synthse

Fondamentaux

Fondamentaux

Mthode de
rvision

Mthode de
rvision

Exemple concret

Exemple concret

class D: public B, public C {


public:
int d;
D(int i, int j, int k, int l)
:B(i,j), C(0,k), d(l)
{cout << "Creation de D" << endl;}

Excution
Si lon excute le petit main suivant :
int main ()
{
D x(1,2,3,4);
x.affiche();
return 0;
}

On obtient le rsultat dexcution suivant :

virtual ~D(){cout << "Destruction de D" << endl;}


void affiche() const{
C::affiche();
B::affiche();
cout<< "D: " << d << endl;
}
};

c EPFL 20022012

c EPFL 20022012

Jamila Sam

Jamila Sam

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

class B: public A {
public:
int b;
B(int i, int j)
:A(i), b(j)
{cout<<"Creation de B" <<endl;}
virtual ~B(){cout << "Destruction de B" <<endl;}
void affiche() const{
A::affiche();
cout << "B: " << b <<endl;
}
};
class C: public A {
public:
int c;
C(int i, int j)
:A(i), c(j)
{cout << "Creation de C" << endl;}
virtual ~C(){cout << "Destruction de C"<< endl;}
void affiche() const{
A::affiche();
cout << "C: " << c <<endl;
}
};

void affiche() const{


cout << "A: " << a <<endl;
}

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Les classes B et C

Informatique II Rvisions 29 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Cration de
Cration de
Cration de
Cration de
Cration de
A: 0
C: 3
A: 1
B: 2
D: 4
Destruction
Destruction
Destruction
Destruction
Destruction

A
B
A
C
D

de
de
de
de
de

D
C
A
B
A
Informatique II Rvisions 30 / 34

Objectifs
Synthse

Classe A virtuelle

Objectifs
Synthse

Fondamentaux
Mthode de
rvision
Exemple concret

Fondamentaux

Pour viter cette duplication, il faut dclarer la classe A comme


virtuelle. Ceci se fait en dclarant le lien dhritage de B et C par
rapport A comme virtuel :

Mthode de
rvision
Exemple concret

class C: public virtual A {


public:
int c;
C(int i, int j)
:A(i), c(j)
....
}
};

les appels au constructeur de A dans les classes


intermdiaires sont alors ignors et lexcution est la
suivante...

c EPFL 20022012

c EPFL 20022012

Jamila Sam

Jamila Sam

Informatique II Rvisions 31 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Synthse

Classe A virtuelle (3)

Objectifs
Synthse
Fondamentaux

Mthode de
rvision

Mthode de
rvision

Exemple concret

Exemple concret

Fin

A
B
C
D

Bonnes rvisions !

de
de
de
de

D
C
B
A

c EPFL 20022012

c EPFL 20022012

Jamila Sam

Jamila Sam

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Informatique II Rvisions 32 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Fondamentaux

Cration de
Cration de
Cration de
Cration de
A: 1
C: 3
A: 1
B: 2
D: 4
Destruction
Destruction
Destruction
Destruction

Pour que a fonctionne bien, il faut aussi faire un appel explicite


au constructeur de A dans la classe la plus drive (D) :
class D: public B, public C {
public:
int d;
D(int i, int j, int k, int l)
// APPEL AU CONSTRUCTEUR DE LA CLASSE VIRTUELLE
:A(i),B(i,j), C(0,k), d(l)
...
}
};

class B: public virtual A { // HERITAGE VIRTUEL


public:
int b;
B(int i, int j)
:A(i), b(j)
...
}
};

Objectifs

Classe A virtuelle (2)

Informatique II Rvisions 33 / 34

C O L E P O L Y T E C H N I Q U E
F DR A L E D E L A U S A N N E

Informatique II Rvisions 34 / 34