1
Interface Homme Machine
Nadine CULLOT nadine.cullot@u-bourgogne.fr
Bureau G218 Sebti FOUFOU sebti.foufou@u-bourgogne.fr
2
Objectifs du cours
Rappel des concepts de la programmation orientée objet et application en langage C++.
Etude du développement d’applications avec une interface graphique (de type Windows) en Visual C++
(Visual Studio 2005 – Standard)
Etude approfondie des MFC (Microsoft Fondation Classes)
Développement d’applications à l’aide de l’assistant
Architectures Documents/Vues
3
Modalités de Contrôle des Connaissances
Un partiel : note de contrôle continu (CC)
Un projet : note de TP (TP)
Un examen final : note de contrôle écrit (CE)
Note module = (0,5*CC + 0,5*TP + CE)/2
Projet réalisé en binôme ou trinôme
Exposé oral, Rapport Ecrit, Démonstration
4
Plan – POO
Les concepts de base de la POO
Encapsulation / Classe
Héritage / Sous-Classes / Classes dérivées
Polymorphisme
Les concepts de base de la POO Introduction
Intuitivement, un objet est une représentation d’une entité du monde réel,
Par exemple un livre, une personne …
Un objet est caractérisé par un ensemble de propriétés
Un livre possède un numéro d’ISBN, un titre, …
Une personne a un nom, un prénom, …
Les objets peuvent avoir des liens entre eux
Une personne possède un livre.
Un livre est écrit par une personne.
Les concepts de base de la POO Introduction
On peut parler d’objets en particulier
Livre : « Le Langage C++ »
Personne : « Bjarne Stroustrup »
Mais tous les objets d’une même « catégorie » ont les mêmes propriétés
On peut donc aussi parler d’ensemble d’objets
Description d’une classe d’objets : classe Livre
Description d’un objet particulier : une instance de la classe
Classe Livre
titre, ISBN, …
Un objet particulier
Titre = « Le langage C++ », ISBN=« 2-7440-1089-8 »
7
Les concepts de base de la POO Introduction
La description des objets d’une classes et de leurs propriétés s’accompagne de la description
Des opérations applicables sur cet objet
Par exemple, pour un livre, on peut avoir besoin de
Connaître les propriétés du livre
Modifier certaines propriétés (ex: prix)
…
8
Les concepts de base de la POO Introduction
L’encapsulation en POO consiste à décrire un ensemble d’objets à l’aide :
D’une classe, avec les propriétés des objets et les opérations/méthodes de manipulation de ces objets
Des droits d’accès sont définis sur les propriétés/attributs et sur les méthodes.
9
Les concepts de base de la POO Introduction
Dans le cadre du développement d’un site de e- commerce pour une librairie,
l’analyse des objets – métiers du domaine pour la gestion du catalogue a conduit à la définition de classes et de relations entre ces classes.
Un livre est écrit par un ou plusieurs auteurs.
Un auteur peut avoir écrit un ou plusieurs livres.
Un livre est édité par un seul éditeur qui peut éditer plusieurs livres.
Un livre possède un thème qui peut avoir plusieurs sous- thèmes.
Un catalogue (de la librairie) est organisé en rayons.
Un rayon est composé de plusieurs livres …
10
Les concepts de base de la POO Introduction
Cette analyse a conduit à la définition du diagramme de classes UML suivant :
LIVRE Titre Sous-titre [0-1]
ISBN Langue DateParution Prix
AUTEUR Nom Prénom Est_écrit_par
1..* 1..*
THEME Nom 1..*
1..*
Sous-thème
EDITEUR Nom Pays
Edite 1..*
1 RAYON Nom CATALOGUE
1..*
1 1..*
1
Les concepts de base de la POO Les classes
On s’intéresse plus particulièrement à la description d’un livre qui est identifié (pour simplifier)
par numéro d’ISBN, son titre, sa date de parution, son prix, son éditeur et son ou ses auteurs.
On souhaite définir :
Des méthodes d’observation pour connaître les propriétés d’un livre,
Des méthodes de mise à jour / modification pour modifier les valeurs de ses propriétés,
Des méthodes d’entrées/sorties pour saisir et afficher un livre.
Les concepts de base de la POO Les classes
class Livre { private :
CString ISBN;
CString titre;
float prix;
Date dateParution;
Auteur tabA[10];
int nbA;
… public:
Livre();
Livre(CString is);
virtual ~Livre();
void setISBN(CString);
void setTitre(CString);
void setPrix(float);
void ajoutAuteur(Auteur);
void setDateP(Date);
CString getISBN();
CString getTitre();
Date getDateP();
int getNbAuteur();
Auteur getAuteur(int);
void saisie();
void affiche();
… };
13
Les classes
Dans la description des attributs de la classe, on suppose que les classes Date et Auteur ont été définies par ailleurs.
La classe CString est une classe de la bibliothèque MFC de C++, elle définit un type chaîne de caractères (qui n’existe pas en C).
Un tableau de 10 auteurs maximum est géré.
Les attributs sont définis avec des droits d’accès « privés »
private : CString ISBN;
CString titre;
float prix;
Date dateParution;
Auteur tabA[10];
int nbA;
14
Les classes
Les droits d'accès
sur les membres d'une classe peuvent être : private
Les membres placés en mode privé ne sont accessibles qu'aux membres de la classe elle-même.
protected
Les membres placés en mode protégé sont accessibles aux membres de la structure elle-même et aux membres des classes descendantes (dans une chaîne d'héritage).
public
Les membres placés en mode public sont accessibles par tout membre situé dans la portée de la classe (en général dans tout le texte source).
15
Les concepts de base de la POO Les classes
Les méthodes d’observation de la classe livre.
Elles permettent de connaître les propriétés du livre.
La syntaxe est : Type-retour classe ::
nom_méthode(paramètres) { corps de la méthode }
L’opérateur :: est appelé opérateur de résolution de portée, il indique ici que la méthode appartient à la classe Livre
CString Livre :: getISBN() {return ISBN;
}
CString Livre :: getTitre() { return titre;}
Date Livre :: getDateP() {return dateParution;
}
int Livre :: getNbAuteur() {return nbA;}
Auteur Livre :: getAuteur(int i) {return tabA[i];
}
16
Les concepts de base de la POO Les classes
Les méthodes de mise à jour/modification de la classe livre permettent de modifier les valeurs des propriétés du livre.
Les attributs de la classe sont directement accessibles dans les méthodes de la classe.
L’ajout d’un auteur est fait directement à partir de l’auteur passé en paramètre et supposé déjà construit avant l’appel de la méthode.
void Livre :: setISBN(CString is) {ISBN = is;}
void Livre :: setTitre(CString t) {titre = t;}
void Livre :: setPrix(float p) {prix = p;}
void Livre :: ajoutAuteur(Auteur a) { if (nbA <10)
tabA[nbA++]=a; }
void Livre :: setDateP(Date d) { dateParution=d;}
Les concepts de base de la POO Les classes
Les constructeurs/ destructeurs sont des méthodes particulières qui permettent l’initialisation des valeurs d’un objet.
Le constructeur par défaut d’un objet est automatiquement appelé lors de la déclaration d’un objet.
On peut définir plusieurs constructeurs pour un objet :
Un constructeur dit « par défaut » qui n’a pas de paramètres.
Des constructeurs avec paramètres qui permettent d’initialiser certains attributs de l’objet avec les valeurs des paramètres.
Attention : à la différence de java, l’opérateur new est réservé en C++ à l’allocation dynamique explicite, il n’est donc utilisé que pour allouer de l’espace pour un pointeur (comme en C).
Le constructeur est une méthode qui porte le même nom que la classe.
Les concepts de base de la POO Les classes
Le destructeur est une méthode qui est appelée lors la variable est « libérée ».
Par exemple, pour une variable locale à une méthode, à la fin de la méthode.
Le destructeur est en général défini s’il est nécessaire de libérer de l’espace mémoire alloué dynamiquement.
Le destructeur porte le même nom que la classe
précédé par le symbole ~.
19
Les concepts de base de la POO Les classes
La classe Livre possède deux constructeurs :
Un constructeur par défaut qui initialise le numéro d’ISBN à 0, et le nombre d’auteurs à 0.
Un constructeur avec un paramètre qui permet de fixer le numéro d’ISBN.
Le destructeur est défini, mais vide. Il n’y a pas d’actions particulières à appliquer.
Livre::Livre() {
ISBN=0; nbA=0;
}
Livre :: Livre (CString is) {
ISBN=is; nbA=0;
}
Livre::~Livre() {
}
20
Les concepts de base de la POO Les classes
Il existe en C++ un autre type de constructeur appelé constructeur par
« copie ».
Son rôle est de créer une copie d’une instance existante d’un objet :
traitement réalisé par défaut : recopie bit à bit d’une zone de mémoire vers une autre
en général suffisant, sauf lorsque de l’allocation dynamique doit être réalisée pour construire l’objet cible
Le constructeur par copie est appelé à chaque fois qu’il est nécessaire de recopier une instance :
lors d’une déclaration d’une instance si l’initialisation est faite à l’aide de la valeur d’une autre
lors du passage par valeur d’une instance à une fonction
lors du renvoi d’une instance par une fonction
l’utilisation de l’affectation ne provoque pas l’appel du constructeur par copie
21
Les concepts de base de la POO Les classes
Les méthodes d’entrées/sorties (en mode console)
Elles permettent de saisir les valeurs d’un objet ou de les afficher.
Les instructions d’E/S du langage C fonctionnent en C++, comme les instructions
printf, scanf, …
Mais les bibliothèques C++ offrent des classes dédiées aux E/S sur périphériques standard, sur fichiers ou en mémoire/chaînes de caractères.
22
Les concepts de base de la POO Les classes
La notion de flot est liée au concept de circulation de données entre un producteur (source) et un consommateur (destination).
quatre flots standard sont définis en C++
cout pour les sorties standard à l’écran
cin pour les entrées standard au clavier
cerr pour les messages d’erreurs, par défaut à l’écran
clog pour les messages d’erreurs avec un tampon
trois sous-ensembles d’opérations
iostream.h opérations liées aux périphériques standard
fstream.h opérations liées aux fichiers disque
strstrea.h opérations sur les chaînes de caractères
Les concepts de base de la POO Les classes
Les opérateurs << et >> sont définis sur les flots.
cout << "ISBN ?";
Affiche le message à l’écran
cin >> ISBN;
Permet la saisie de la valeur de l’ISBN
ATTENTION : Les opérateurs << et
>> existent sur tous les types de base (int, float, …) et certains types de la bibliothèque C++.
Mais il n’existe pas par défaut pour les classes Auteur et Date utilisées ici, mais on peut les définir (par surcharge).
void Livre :: saisie()
{ cout << "ISBN ?"; cin >> ISBN;
cout << "Titre ?"; cin >> titre;
cout << "Prix ? "; cin >> prix;
cout << "date de parution ?"; cin <<
dateP;
do
{cout << "Nombre d'auteurs (<=10) ?";
cin >> nbA;}
while (nbA <0 || nbA >10);
for (int i=0; i<nbA; i++)
{ cout << "Auteur numéro " << i << "?";
cin >> tabA[i]; } }
Les concepts de base de la POO Les classes
La méthode « affiche » affiche toutes les informations d’un livre.
Ici, les informations concernant la date et les auteurs sont affichées en utilisant l’opérateur <<
qui devra être défini dans les classes Auteur et Date.
void Livre :: affiche()
{ cout << "ISBN : " << ISBN << endl;
cout << "Titre :" << titre << endl;
cout << "Prix : " << prix << endl;
cout << " Date :" << dateParution
<< endl;
for (int i=0; i<nbA; i++) cout << tab[i] << endl;
}
25
Les concepts de base de la POO Les classes
Exemples d’utilisation de la classe Livre.
Livre liv1;
// déclare un livre – appel du constructeur par défaut
Livre liv2("3-456-456-7");
// déclare un livre – appel du constructeur avec paramètres
Livre liv3 = Livre ("3-456-456-7");
// autre forme de déclaration et appel du constructeur avec paramètres
Livre liv4=liv2;
// initialisation avec un autre livre – appel du constructeur par copie
26
Les classes
Surcharge des méthodes et des opérateurs
Les méthodes d’une classe peuvent être
« surchargées »
C’est à dire que l’on peut définir dans une même classe plusieurs méthodes de même nom mais qui diffèrent par leurs paramètres.
Supposons que l’on souhaite définir une deuxième méthode d’affichage :
void Livre :: affiche (int);
Avec un paramètre qui indique l’attribut à afficher.
27
Les concepts de base de la POO
Les classes
Surcharge des méthodes et des opérateurs
La classe Livre peut alors être complétée:
Dans l’entête, on ajoute :
class Livre { ..
void affiche(int);
}
Dans le corps, on ajoute
void Livre :: affiche (int code){ // code souhaité ….}
Le compilateur choisit la bonne méthode à l’aide du profil des méthodes.
28
Les concepts de base de la POO
Les classes
Surcharge des méthodes et des opérateurs
C++ offre aussi un mécanisme puissant de surcharge des opérateurs (inexistant en java).
Tous les opérateurs de C++ peuvent être surchargés.
Arithmétique +, -, /, *
Comparaison < <= > >= != ==
Logique && || !
Incrémentation ++ --
mais aussi l’opérateur de « sélection » []
Etc …
Les concepts de base de la POO
Les classes
Surcharge des méthodes et des opérateurs
La surcharge d’un opérateur consiste à définir cet opérateur pour un objet d’une classe définie par le programmeur.
Par exemple, pour la classe Livre, on souhaite surcharger l’opérateur de comparaison ==, en utilisant l’ISBN comme critère de comparaison.
i.e. que l’on veut permettre l’écriture de la comparaison de 2 livres sous la forme
if (liv1 == liv2) …
Et que la comparaison s’effectue sur l’ISBN
Les concepts de base de la POO
Les classes
Surcharge des méthodes et des opérateurs
On ajoute dans la classe Livre, le code suivant :
Entête :
bool operator==(Livre);
Implémentation
bool Livre :: operator== (Livre lv) { if (ISBN == lv.ISBN)
return true;
else return false;
}
31
Les concepts de base de la POO
Les classes
Surcharge des méthodes et des opérateurs
La surcharge de l’opérateur est définie comme une méthode de la classe.
Elle effectue la comparaison de l’objet courant avec l’objet en paramètre.
On peut appeler cet opérateur de 2 façons (avec Livre liv1, liv2; …)
if ( liv1.operator==(liv2)) …
if (liv1 == liv2) …
La deuxième forme est la forme couramment utilisée (forme dite en infixe).
32
Les concepts de base de la POO
Les classes
Surcharge des méthodes et des opérateurs
On peut aussi surcharger les opérateurs de flots
<<, >> pour des classes n’importe quelle classe.
On souhaite par exemple surcharger l’opérateur de flots de sortie << pour afficher un livre.
On peut faire la même chose pour la saisie d’un livre, i.e. surcharger l’opérateur >>.
33
Les concepts de base de la POO
Les classes / Les méthodes/classes amies
Méthodes amies
Idée intuitive : possibilité de donner des droits spéciaux
de manipulation des champs privés ou protégés d'une classe
à une méthode “externe” à la classe.
nécessité de “nommer” cette méthode comme ayant des droits spéciaux dans la classe concernée
concept de méthode amie d’une classe
C’est une méthode :
qui n'est pas membre de la classe
mais qui a le droit de manipuler les membres privés et protégés de la classe
La déclaration se fait par le mot-clé "friend"
34
Les concepts de base de la POO Les classes dérivées
Possibilité de définir de nouveaux objets à partir des objets existants
Hiérarchie de généralisation/ spécialisation
Une classe descendante hérite des propriétés de sa classe mère (attributs et méthodes)
Elle peut être spécifiée :
par enrichissement par rapport à sa classe mère (ajout de nouveaux champs ou ajout de nouvelles méthodes)
par substitution i.e. surcharge de certaines méthodes (et par héritage direct de certaines autres)
Les concepts de base de la POO Les classes dérivées
Les droits en héritage
Pour définir une classe comme héritière d'une autre classe, il faut indiquer le nom de la classe ancêtre et les droits d'héritage
Ces droits d'héritage peuvent être :
public
Les membres sont hérités avec les droits d'accès de leur classe de base (excepté les membres privés de la classe ancêtre qui sont inaccessibles dans la classe héritière )
private
Les membres sont hérités avec des droits d'accès restreints par rapport à ceux de leur classe de base (en fait tout membre hérité devient privé, c'est le mode implicite d'héritage).
Les concepts de base de la POO Les classes dérivées
La syntaxe de définition d'une classe héritière :
class classe_dérivée : mode_héritage classe_ancêtre {
//déclarations des nouveaux membres } ;
37
Les classes dérivées
On souhaite définir une classe « spécialisée » de livres pour décrire les livres anciens.
LivreAncien : qui comporte une propriété spécifique qui est sa « cotation » et un attribut qui donne des informations sur l’histoire du livre.
Ajout de 2 attributs
Ajout des méthodes permettant de travailler sur ces nouvelles propriétés et surcharge des méthodes de saisie et d’affichage.
38
Les classes dérivées
class LivreAncien : public Livre {
private : float cotation;
CString histoire;
public:
LivreAncien();
LivreAncien(CString);
virtual ~LivreAncien();
void setCotation(float);
void setHistoire(CString);
float getCotation();
CString getHistoire();
void affiche();
void saisie();
};
La classe comporte 2 constructeurs.
2 nouveaux attributs
4 nouvelles méthodes (get et set) sur les nouveaux attributs
Et la surcharge des méthodes de saisie et d’affichage.
39
Les concepts de base de la POO Les classes dérivées
void LivreAncien :: affiche() { Livre:: affiche();
cout << "Cotation : " << cotation << endl;
cout << "Histoire : " << histoire << endl;
}
void LivreAncien :: saisie() { Livre:: saisie();
cout << "Cotation ? "; cin >> cotation ; cout << "Histoire ? "; cin >> histoire ; }
Les instructions :
Livre:: affiche();
Livre :: saisie();
Provoque l’appel des méthodes affiche et saisie de la classe Livre.
Puis les autres instructions sont exécutées.
40
Les concepts de base de la POO Les classes dérivées
Constructeurs et héritage
Lorsque le constructeur d’une classe héritière est appelé, le constructeur de la classe mère doit également être appelé.
On a successivement :
appel du constructeur de la classe mère
appel des constructeurs des membres de la classe héritière
exécution des instructions du corps du constructeur de la classe héritière
Sans indication particulière, c’est le constructeur par défaut de la classe mère qui est appelé.
Les concepts de base de la POO Les classes dérivées
L’appel au constructeur par défaut de LivreAncien
Provoque tout d’abord l’appel du constructeur de Livre
Puis les autres instructions sont exécutées.
Le même principe est appliquée pour le constructeur avec paramètres.
L’appel du constructeur de la classe mère est fait par : Livre(is)
LivreAncien::LivreAncien() : Livre()
{ cotation=0;
histoire="";
}
LivreAncien::LivreAncien(CString is) : Livre(is)
{ cotation=0;
histoire="";
}
Les concepts de base de la POO Les classes / Les classes dérivées
Exemple :
Description des classes Date, Auteur, Livre et LivreAncien
Avec surcharge des opérateurs de comparaison (==) et de flots d’E/S (<<, >>)
Programme de test de ces classes avec une application qui gère une tableau de Livre (Livre ou LivreAncien) et la possibilité
d’ajouter des livres