Vous êtes sur la page 1sur 46

1

Programmation Oriente Objet (POO)


UNIVERSITE de METZ
Olivier HABERT
Matre de Confrences
Laboratoire d'Automatique
des
Systmes Coopratifs
(LASC)

Programmation Oriente Objet (POO)


Qu'est ce quun Programme Oriente Objet ?
Ensemble d'objets autonomes et responsables qui
s'entraident pour rsoudre un problme final en
s'envoyant des messages.
Objet 1

Message

Objet 3
Objet 2

Programmation Oriente Objet


Quest ce quun objet
Objet = Donnes + Mthodes (Fonctions Membres)
Fonction 1

Fonction
6

Fonction 2

DONNEES

Fonction 5

Fonction 4

Fonction
3

Programmation Oriente Objet


Exemple dun objet
Rsistance
SetValueR

GetRmin

GetRmax

SetValueP

GetValueP

GetValueR

Programmation Oriente Objet


Encapsulation des donnes
Laccs aux donnes des objets est rglement
Donnes prives accs uniquement par les fonctions membres
Donnes publiques accs direct par linstance de lobjet

Consquences
Un objet nest vu que par ses spcifications
Une modification interne est sans effet pour le fonctionnement
gnral du programme
Meilleure rutilisation de lobjet

Exemple de la rsistance
Les donnes R et P ne peuvent tre utilises que par les fonctions
membres

Programmation Oriente Objet


Polymorphisme (du Grecqueplusieurs formes)
Un nom (de fonction, doprateur) peut tre associ plusieurs
mais diffrentes utilisations
Exemple
Si a est un nombre complexe, sqrt(a) appellera si elle existe la
fonction adapte au type de a.
Dans un langage non OO, il aurait fallu connatre le nom de deux
fonctions distinctes (selon que a soit complexe ou rel)
Cest le systme qui choisit selon le type de largument ou de
loprande

Programmation Oriente Objet


LHritage
Permet de dfinir les bases dun nouvel objet partir
dun objet existant
Le nouvel objet hrite des proprits de lanctre et
peut recevoir de nouvelles fonctionnalits

Avantages
Meilleures rutilisations des ralisations antrieures
parfaitement au point

Programmation Oriente Objet


Concept de Classe
Type runissant une description
Dune collection de donnes membres htrognes ayant un lien
entres elles
Dune collection de mthodes (fonctions membres) servant
manipuler les donnes membres

Gnralisation du type structure ou record des langages non


OO (classe = dfinition de donnes + dfinition de mthodes)
Possibilit de fixer la visibilit externe des diffrents
constituants de la classe

Programmation Oriente Objet


Instance dune classe
Cest un objet initialis partir de la description fige
dune classe

Fonctions membres publiques

Les constructeurs
Les destructeurs
Les accesseurs
Les modificateurs

10

Programmation Oriente Objet


Les Constructeurs
Permettent dinitialiser lobjets lors de sa cration
copie des arguments vers les donnes membres
initialisation de variables dynamiques la cration de lobjet

Sont appels de manire automatique la cration de lobjet


Peuvent tre surchargsOn peut en dfinir plusieurs de
mme nom mais acceptant des arguments diffrents
Possdent le mme nom que la classe

11

Programmation Oriente Objet


Le Destructeur
Il est unique
Est appel automatiquement lors de la destruction de
lobjet
Sert gnralement liminer les variables dynamiques
de lobjet (cres en gnral par le constructeur)
Il a pour nom le nom de la classe prcd du symbole
~

12

Programmation Oriente Objet


Les Accesseurs
Catgorie de fonctions membres qui permettent laccs
et lutilisation des informations prives contenues dans
lobjet

Les Modificateurs
Permettent de modifier ltat des donnes internes
(publiques ou prives) de lobjet

13

Programmation Oriente Objet


Dfinition dune Classe en C++
class nom_classe
{
private:
Dclaration des donnes prives et des fonctions membres
prives
public:
Dclaration des donnes publiques et des fonctions
membres publiques
};

14

Programmation Oriente Objet


Exemple
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();
};

15

Programmation Oriente Objet


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

Exemple
float 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;
}

16

Programmation Oriente Objet


Cration dun objet statique en C++
nom de la classe nom de lobjet(arguments);
Exemple:
BouteilleBiere MaBouteille("1664","blonde",33.0,6.5,20);

Cration dun 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;

17

Programmation Oriente Objet


Accs aux fonctions membres dun objet en C++
Si lobjet est reprsent par une variable
Nom_Variable.Nom fonction;
Exemple:

Mabouteille.GetContenance();

Si lobjet est reprsent par un pointeur


Nom_pointeurNom fonction;
Exemple:

pMabouteilleGetContenance();

18

Programmation Oriente Objet


Programme complet
#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;
}

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;
}
main()
{
BouteilleBiere* Mabouteille;
Mabouteille = new BouteilleBiere("Kro","brune",25.0,5.5,30);
cout << MabouteilleGetContenance();
delete Mabouteille;
}

25

19

Programmation Oriente Objet


Programme complet avec destructeur
#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;
}

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 << MabouteilleGetContenance();
delete Mabouteille;

int BouteilleBiere::GetNBBPES()
{
return NBBPES;
}
}

25 c'est fini !!

20

Programmation Oriente Objet


Hritage en C++
Spcifications Classe Drive = Spcifications Classe
Anctre + Nouvelles Spcifications
Hritage des donnes et des fonctions membres sauf:
Les constructeurs et destructeurs de l'anctre

Introduction d'un nouveau statut: protected


membre ne pouvant tre utilis que par les fonctions
membres de la classe et de celles qui en seront drives

21

Programmation Oriente Objet


Syntaxe d'hritage
class nom_nouvelle_classe : type hritage nom_anctre {};

Exemple
On dsire crer une classe BouteilleVin partir de
BouteilleBiere
class BouteilleVin : public BouteilleBierre {}

22

Programmation Oriente Objet


Type d'hritage
Rgles de drivation de classe
mode de
drivation
private

protected

public

statut du membre dans la classe anctre

statut du membre dans la classe


drive

private
protected
public
private
protected
public
private
protected
public

inaccessible
private
private
inaccessible
protected
protected
inaccessible
protected
public

23

Programmation Oriente Objet


Consquences des diffrents type de drivation
Drivation prive: (* mode par dfaut)
Les membres deviennent private ou inaccessible
Tous les membres seront inaccessibles la seconde drivation

Drivation publique:
Les membres gardent le mme statut sauf les membres private qui
deviennent inaccessibles

Drivation protge:
Tous les membres non privs deviennent de type protected,
protected les membres
privs deviennent inaccessibles

24

Programmation Oriente Objet


Ajout de donnes et de fonctions membres
class BouteilleVin : public BouteilleBierre
{
public:
BouteilleVin(char *n, char *coul, float c, float t, int n, int a) :
BouteilleBiere(char *n, char *coul, float c, float t, int n);
BouteilleVin(char * nom, float t) : BouteilleBiere(char * nom, float t) ;
int GetAnnee();
private:
int annee;
};

25

Programmation Oriente Objet


Constructeurs et Destructeur dans les oprations
d'hritages
Quand la fois la classe de base et la classe drive ont des
constructeurs et des destructeurs:
Constructeurs sont excuts dans l'ordre de la drivation
Destructeurs dans l'ordre inverse de la drivation

C'est au constructeur de l'objet driv en dernier de passer les


arguments dont a besoin son anctre. (voir exemple
prcdent)

26

Programmation Oriente Objet


Quelques exemples d'hritages
#include <iostream.h>

main()

class base {

int x;

derive ob;

public:

ob.setx(10);

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

ob.sety(20);

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

ob.showx();

};

ob.showy();

class derive : public base {

return(0);

int y;

public:
void sety(int n) {y=n;}
void showy() {cout << y << '\n';}
void show_somme() {cout << x+y <<'\n';}
};

Cherchez l'erreur ?

27

Programmation Oriente Objet


Quelques exemples d'hritages
#include <iostream.h>

main()

class base {

int x;

derive ob;

public:

ob.setx(10);

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

ob.sety(20);

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

ob.showx();

};

ob.showy();

class derive : private base {

return(0);

int y;

public:
void sety(int n) {y=n;}
void showy() {cout << y << '\n';}
};

Cherchez l'erreur ?

28

Programmation Oriente Objet


Quelques exemples d'hritages
#include <iostream.h>

main()

class base {

int x;

derive ob;

public:

ob.setxy(10,20);

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

ob.showxy();

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

return(0);

};

class derive : private base {


int y;
public:
void setxy(int n,int m) {setx(n) ; y=m;}
void showxy() {showx(); cout << y << '\n';}
};

Pourquoi a marche
maintenant ?

29

Programmation Oriente Objet


Quelques exemples d'hritages
#include <iostream.h>
class base {
public:

Affichage Ecran

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 drive \n";}
~derive(){cout << "destruction de la classe drive \n";}
};
main()
{
derive o;
return(0);
}

construction de la classe de base


construction de la classe drive
destruction de la classe drive
destruction de la classe de base

30

Programmation Oriente Objet


Quelques exemples d'hritages
#include <iostream.h>
class base {
public:
base(){ cout <<"construction de la classe de base \n;}
~base(){ cout <<"destruction de la classe de base \n;}

main()
{
derive o(10);
o.showj();
return(0);
}

};
class derive : public base{
int j;
public:
derive(int n) { j = n; cout << "construction de la classe drive \n";}
~derive(){cout << "destruction de la classe drive \n";}
showj(){ cout <<j <<'\n';}
};

Affichage Ecran
construction de la classe de base
construction de la classe drive
10
destruction de la classe drive
destruction de la classe de base

31

Programmation Oriente Objet


Quelques exemples d'hritages
#include <iostream.h>
class base {
int i;
public:
base(int n){ i=n; cout <<"construction de la classe de base \n;}

main()
{
derive o(10);
o.showi();
o.showj();
return(0);
}

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


void showi(){cout <<i<<'\n';}
};
class derive : public base{

Affichage Ecran

int j;
public:
derive(int n) :base(n){
j = n; cout << "construction de la classe drive \n";}
~derive(){cout << "destruction de la classe drive \n";}
showj(){ cout <<j <<'\n';}

construction de la classe de base


construction de la classe drive
10
10
destruction de la classe drive
destruction de la classe de base

32

Programmation Oriente Objet


Quelques exemples d'hritages
#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;}

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

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 drive \n";}
~derive(){cout << "destruction de la classe drive \n";}
showj(){ cout <<j <<'\n';}
};

Affichage Ecran
construction de la classe de base
construction de la classe drive
20
10
destruction de la classe drive
destruction de la classe de base

33

Programmation Oriente Objet


Surcharge des Fonctions
On peut dfinir des fonctions de mme nom mais se
diffrentiant 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 systme choisira la fonction appeler selon les
arguments.

34

Programmation Oriente Objet


Surcharge des oprateurs en C++
Mme principe que la surcharge des fonctions
Le fonctionnement de l'oprateur s'effectue en fonction du
nombre et du type des oprandes
La surcharge d'un oprateur doit obligatoirement s'associer
une classe

35

Programmation Oriente Objet


Surcharge des oprateurs 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';
}

36

Programmation Oriente Objet


Passage de paramtres par rfrence en C++
Idem dans les spcifications 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 rfrence:


void permutter (int &a, int &b) {int temp = a;a = b; b = temp;}
main() {int a=8;int b=7;permutter(a,b);}

37

Programmation Graphique sous


Windows
Programmation avec les API (Application
Programming Interface)
Que sont les API
Ensemble d'interfaces pour accder la fonctionnalit des
services de bas niveau (gestion des priphriques, du
systme, du rseau,)
Implantes sous forme de librairie (DLL)

38

Prototype de Fonctions
et Variables Globales
//useful defines
#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "resource.h"
//entry point for a windows program
int WINAPI WinMain(HINSTANCE, HINSTANCE,
LPSTR, int);
//main window callback function
LRESULT CALLBACK WindowFunc(HWND, UINT,
WPARAM, LPARAM);
// GLOBAL VARIABLES
const char* pClassName="TTWin32Generic";
HINSTANCE hMainInst=0; //instance of the
application
HWND hMainWnd=0;
//handle to main window
of the application
//various variables used with virtual window
HDC memdc=0;
HBITMAP hbit=0;
HBRUSH hbrush=0;
HPEN hpen, hOldPen;
RECT rClient;
int MaxX=0, MaxY=0;

Cration de la classe
de la fentre
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgs,
int nWinMode)
{
//create a window class by filling in a WNDCLASSEX structure
WNDCLASSEX WinClass;
WinClass.cbSize=sizeof(WNDCLASSEX); //size of the structure
WinClass.hInstance=hInstance; //instance of the application
hMainInst=hInstance;
WinClass.lpszClassName=pClassName; //window class name
WinClass.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) icon
WinClass.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 cursor
WinClass.hCursor=LoadCursor(NULL, IDC_ARROW);
//here we can specify a menu handle
WinClass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU);
WinClass.cbClsExtra=0;
WinClass.cbWndExtra=0;
WinClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUS
H);
//register window class we just created
if(!RegisterClassEx(&WinClass))
return 0; //registration failed

Cration de la
Fentre
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 failed
return 0;
hMainWnd=hwnd;
//show window
ShowWindow(hwnd, nWinMode);
//force a repaint
UpdateWindow(hwnd);
MSG WinMsg;
//start message pump
while(GetMessage(&WinMsg, NULL, 0, 0))
{
TranslateMessage(&WinMsg);
DispatchMessage(&WinMsg);
}
return WinMsg.wParam;
}

39

Dfinition de la Procdure de Fentre


(Rponse aux diffrents messages)

LRESULT CALLBACK WindowFunc(HWND hwnd,


UINT Msg,
WPARAM wParam, LPARAM lParam)
{
//device context for drawing
HDC hdc=0;
switch(Msg)
{
case WM_CREATE:
{
//get height and width of the screen
MaxX=GetSystemMetrics(SM_CXSCREEN);
MaxY=GetSystemMetrics(SM_CYSCREEN);
//get device context
hdc=GetDC(hwnd);
//create compatible device context to memory
memdc=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 repainted
case WM_PAINT:
{
PAINTSTRUCT paintstruct;
//get device context for drawing
hdc=BeginPaint(hwnd, &paintstruct);
//paint the window
BitBlt(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 message
InvalidateRect(hwnd, (const RECT*)NULL, TRUE);
break;
}

//if menu item selected


case WM_COMMAND:
{
WORD wID=LOWORD(wParam); //id of the
menu item
switch(wID)
{
case IDM_FOPEN:
//File->Open is disabled for now
break;
case IDM_EXIT:
DestroyWindow(hwnd);
break;
}
break;
}
case WM_DESTROY:
//release used resources
SelectObject(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;
}

40

Programmation Graphique sous


Windows

Excution du programme

41

Programmation Graphique sous


Windows
Programmation avec une bibliothque d'objets
Exemple:
ObjectWindows de Borland ou Microsoft Fundation
Classes (MFC)
Collection d'objets graphiques que l'on peut driver et
amliorer

42

Programmation Graphique sous


Windows
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;
}

43

Programmation Graphique sous


Windows
Excution du Programme

44

Programmation Graphique sous


Windows
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 gre graphiquement la
manipulation des objets

45

Programmation Graphique sous


Windows
Cration d'une Application avec C++ Builder

46

Programmation Graphique sous


Windows
Cration d'une Application avec Visual Basic

Vous aimerez peut-être aussi