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)
http://www.lasc.univ-metz.fr/article.php3?id_article=67

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 2

Fonction 6

DONNEES

Fonction 3

Fonction 5

Fonction 4

Programmation Oriente Objet


Exemple dun objet
Rsistance
SetValueR SetValueP

GetRmin

GetValueR

GetRmax

GetValueP

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; } 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; } BouteilleBiere::~BouteilleBiere() { cout <<"c'est fini !!"<<'\n'; } main() { BouteilleBiere* Mabouteille; Mabouteille = new BouteilleBiere("Kro","brune",25.0,5.5,30); cout << MabouteilleGetContenance(); delete Mabouteille;

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 statut du membre dans la classe anctre
private protected public private protected public private protected public

statut du membre dans la classe drive


inaccessible private private inaccessible protected protected inaccessible protected public

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, 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(n, coul, c, t, n); BouteilleVin(char * nom, float t) : BouteilleBiere(nom,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> 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 ?

27

Programmation Oriente Objet


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

28

Programmation Oriente Objet


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

29

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

Affichage Ecran

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;} }; 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';} }; main() { derive o(10); o.showj(); return(0); }

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;} ~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 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 main() { derive o(10); o.showi(); o.showj(); return(0); }

Affichage Ecran

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;} 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';} }; main() { derive o(10,20); o.showi(); o.showj(); return(0); }

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

Excution du programme

Programmation Graphique sous Windows

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