+ All Categories
Home > Documents > PROGRAMARE ORIENTATĂ PE OBIECTE - math.uaic.romapetrii/POO/depozit/Curs6.pdf · Programare...

PROGRAMARE ORIENTATĂ PE OBIECTE - math.uaic.romapetrii/POO/depozit/Curs6.pdf · Programare...

Date post: 14-Sep-2019
Category:
Upload: others
View: 26 times
Download: 1 times
Share this document with a friend
12
Programare orientată pe obiecte Curs 6 1 PROGRAMARE ORIENTATĂ PE OBIECTE Funcții și clase template O funcție template (şablon, generică) este un tipar utilizat de compilator pentru a construi automat diverse funcţii. Se utilizează pentru implementarea de funcţii care diferă doar prin tipul parametrilor Sintaxă: template <par1, par2,..., parN> antet_functie; unde: par1,…,parN sunt parametrii funcției template, de regulă constante sau tipuri de date specificate prin cuvântul cheie class sau typename. Important: Toţi parametrii din lista parametrilor şablonului (template) trebuie să apară în lista de parametri formali ai funcţiei template. Sintaxa pentru apelul funcților template este nume_functie (exp1, exp2,...,expN) unde exp1, exp2,...,expN sunt expresii din care se deduc tipurile concrete sau nume_functie <tip1,tip2,…, tipN>(lista_parametri) unde tip1, tip2,...,tipN sunt tipuri concrete sau constante utilizate pentru a genera versiunea corespunzătoare de funcție. Important: Generarea de cod pentru entitatea template are loc la compilare. La apelul funcţiei parametrizate, tipul argumentelor determină care versiune a şablonului este folosită. Exemplu: In locul funcțiilor int maxim(int x,int y){ if(x<y)return y; return x; }
Transcript
Page 1: PROGRAMARE ORIENTATĂ PE OBIECTE - math.uaic.romapetrii/POO/depozit/Curs6.pdf · Programare orientată pe obiecte Curs 6 1 PROGRAMARE ORIENTATĂ PE OBIECTE Funcții și clase template

Programare orientată pe obiecte Curs 6

1

PROGRAMARE ORIENTATĂ PE OBIECTE

Funcții și clase template

O funcție template (şablon, generică) este un tipar utilizat de compilator pentru a construi

automat diverse funcţii. Se utilizează pentru implementarea de funcţii care diferă doar prin tipul

parametrilor

Sintaxă: template <par1, par2,..., parN>

antet_functie;

unde:

par1,…,parN sunt parametrii funcției template, de regulă constante sau tipuri de date

specificate prin cuvântul cheie class sau typename.

Important: Toţi parametrii din lista parametrilor şablonului (template) trebuie să apară în lista de

parametri formali ai funcţiei template.

Sintaxa pentru apelul funcților template este

nume_functie (exp1, exp2,...,expN)

unde exp1, exp2,...,expN sunt expresii din care se deduc tipurile concrete

sau

nume_functie <tip1,tip2,…, tipN>(lista_parametri)

unde tip1, tip2,...,tipN sunt tipuri concrete sau constante utilizate pentru a genera

versiunea corespunzătoare de funcție.

Important: Generarea de cod pentru entitatea template are loc la compilare. La apelul funcţiei

parametrizate, tipul argumentelor determină care versiune a şablonului este folosită.

Exemplu:

In locul funcțiilor

int maxim(int x,int y){ if(x<y)return y; return x; }

Page 2: PROGRAMARE ORIENTATĂ PE OBIECTE - math.uaic.romapetrii/POO/depozit/Curs6.pdf · Programare orientată pe obiecte Curs 6 1 PROGRAMARE ORIENTATĂ PE OBIECTE Funcții și clase template

Programare orientată pe obiecte Curs 6

2

double maxim(double x,double y){ if(x<y)return y; return x; } Complex maxim(Complex x,Complex y){ if(x<y)return y; return x; }

putem folosi

template<typename T> T maxim(T x,T y){ if(x<y)return y; return x; } O clasă template (generică) este un model (un şablon) utilizat pentru generarea unor clase

concrete, clase ce diferă prin tipul anumitor date membre.

Sintaxă: template < par1, par2,..., parN > declarare_clasă;

unde

par1, par2,..., parN sunt parametrii clasei template, de regulă constante sau tipuri de

date specificate prin cuvântul cheie class sau typename.

Sintaxa pentru instanțiere: nume_clasa <tipC1,tipC2,…, tipCn>

nume_obiect(lista_param_constructor);

unde tipC1, tipC2,...,tipCn sunt tipuri concrete sau constante utilizate pentru a genera

versiunea corespunzătoare de funcție.

Exemplu: class Complex{ double re, im; public: Complex(double re=0, double im=0){ this->re=re; this->im=im; } int operator<(const Complex& c){ return re<c.re && im<c.im; } friend ostream& operator<<(ostream& out, const Complex& z){ if(z.re==0)out<<z.im<<(z.im?"i":""); else if(z.im==0)out<<z.re; else out << z.re<<(z.im>0?"+":"")<<z.im<<"i"; return out; } };

Page 3: PROGRAMARE ORIENTATĂ PE OBIECTE - math.uaic.romapetrii/POO/depozit/Curs6.pdf · Programare orientată pe obiecte Curs 6 1 PROGRAMARE ORIENTATĂ PE OBIECTE Funcții și clase template

Programare orientată pe obiecte Curs 6

3

class Persoana { protected: char *nume; public: Persoana(char *nume="") { this->nume = new char[strlen(nume)+1]; strcpy(this->nume, nume); } virtual ~Persoana() { if (nume){ delete []nume; nume = 0; } } }; class Student: public Persoana{ protected: char facultate[100]; public: Student(char *nume="",char facultate[100]=""):Persoana(nume){ for(int i=0;i<100;i++) this->facultate[i]=facultate[i]; } ~Student(){} Student& operator=(const Student& s){ if(this!=&s){ nume = new char[strlen(s.nume)+1]; strcpy(nume, s.nume); for(int i=0;i<100;i++)facultate[i]=s.facultate[i]; } return *this; } }; template <class Element, int MAX_STIVA> class Stiva { private: Element tab[MAX_STIVA]; int index_virf; public: Stiva(); ~Stiva(); void push(Element); void pop(); Element top(); bool is_empty(); }; template <class Element, int MAX_STIVA> Stiva<Element, MAX_STIVA>::Stiva(){ index_virf = -1; } template <class Element, int MAX_STIVA> Stiva<Element, MAX_STIVA>::~Stiva(){} template <class Element, int MAX_STIVA> void Stiva<Element, MAX_STIVA>::push(Element e){ if (index_virf<MAX_STIVA-1) tab[++index_virf] = e; }

Page 4: PROGRAMARE ORIENTATĂ PE OBIECTE - math.uaic.romapetrii/POO/depozit/Curs6.pdf · Programare orientată pe obiecte Curs 6 1 PROGRAMARE ORIENTATĂ PE OBIECTE Funcții și clase template

Programare orientată pe obiecte Curs 6

4

template <class Element, int MAX_STIVA> void Stiva<Element, MAX_STIVA>::pop(){ if (index_virf >= 0) index_virf--; } template <class Element, int MAX_STIVA> Element Stiva<Element, MAX_STIVA>::top(){ if (index_virf < 0) return Element(); return tab[index_virf]; } template <class Element, int MAX_STIVA> bool Stiva<Element, MAX_STIVA>::is_empty(){ return index_virf == -1; } void main(void) { Stiva<char,10> S1; S1.push('a'); S1.push('f'); S1.pop(); cout << S1.top() << endl; Stiva<Student,5> S2; S2.push(Student("Popescu","Matematica")); S2.push(Student("Alexandrescu","Drept")); Stiva<Complex,10> S3; S3.push(Complex(1,2)); }

În exemplul precedent se observă cum folosind o clasa tip șablon am putut crea trei stive S1, S2,

S3 cu elemente diferite. În clasa Student, lipsa supraîncărcării operatorului = ar fi condus la o

eroare in timpul rulării.

Page 5: PROGRAMARE ORIENTATĂ PE OBIECTE - math.uaic.romapetrii/POO/depozit/Curs6.pdf · Programare orientată pe obiecte Curs 6 1 PROGRAMARE ORIENTATĂ PE OBIECTE Funcții și clase template

Programare orientată pe obiecte Curs 6

5

Diagrame UML UML( Unified Modeling Language) este un limbaj vizual de modelare utilizat pentru specificarea,

construirea şi documentarea sistemelor de aplicaţii orientate obiect şi nu numai.

O diagrama UML este o prezentare grafică ale unui set de elemente, cel mai adesea exprimate ca

un graf de noduri (elementele) și arce (relațiile).

Tipuri de diagrame UML

Diagrame ale Cazurilor de Utilizare (Use Case)

Diagrame de clase

Diagrame de obiecte

Diagrame de secvenţă

Diagrame de stare

Diagrame de colaborare

Diagrame de activitate

Diagramele de clase sunt folosite în modelarea orientată obiect pentru a descrie structura statică a

sistemului, modului în care este el structurat. Se oferă o notaţie grafică pentru reprezentarea

claselor (entităţi ce au caracteristici comune) și relațiilor (relațiile dintre două sau mai multe

clase).

Reprezentarea unei clase

IdClasa

vizibilitate idAtribut

vizibilitate idAtribut: tip

vizibilitate idAtribut:

tip=valoare_implicita

vizibilitate idMetoda

vizibilitate

idMetoda(lista_param):tip_returnat

Specificarea Atributelor

Sintaxa: vizibilitate idAtribut : tip = valoare_implicitia

unde:

vizibilitate reprezintă protecția atributului și poate să aibă una din următoarele valori

+ - public

- - privat

# - protected (opțional)

idAtribut este identificatorul atributului

tip – este tipul acestuia

valoare_implicita reprezintă valoarea inițială a atributului (opțională)

Page 6: PROGRAMARE ORIENTATĂ PE OBIECTE - math.uaic.romapetrii/POO/depozit/Curs6.pdf · Programare orientată pe obiecte Curs 6 1 PROGRAMARE ORIENTATĂ PE OBIECTE Funcții și clase template

Programare orientată pe obiecte Curs 6

6

Specificarea Metodelor

Sintaxa: vizibilitate idMetoda(idP1:tip1, ..., idPn:tipN) : tip_returnat

unde:

vizibilitate reprezintă protecția atributului și poate să aibă una din următoarele valori

+ - public

- - privat

# - protected (opțional)

idMetoda este identificatorul metodei

idP1,..., idPn sunt parametrii metodei

tip1, ..., tipN sunt tipurile parametrilor

tip_returant reprezintă tipul valorii returnate de metodă

Elementele utilizate şi notaţiile lor sunt următoarele:

Element Descriere Notaţie

Clasă

O clasă este reprezentată printr-un dreptunghi cu trei

compartimente: în cel de sus se trece numele clasei, în mijloc

se trec atributele clasei iar jos se trec operaţiile specifice

clasei.

Moştenire

Moştenirea este o relaţie care indică faptul că o clasă

moşteneşte caracteristicile unei clase părinte. Sensul săgeţii

indică sensul în care se poate spune despre clasa copil că este

de tipul clasă părinte.

Asociere

Asocierea este o relaţie generică între două clase. Aceste pot

defini regulile numerice de asociere (unu la unu, unu la mai

mulţi, mai mulţi la mai mulţi).

Dependenţă

Atunci când o clasă depinde de o altă clasă, în sensul că

utilizează acea clasă ca şi atribut al său, se foloseşte relaţia de

dependenţă.

Agregare

Agregarea indică o relaţie de tip întreg-parte (se poate spune

despre clasa părinte că are clase de tip copil). În această

relaţie, clasa copil poate exista şi fără clasa părinte.

Compoziţie

Această relaţie derivă din agregare dar se utilizează atunci

când o clasă copil nu poate exista decât în cazul existenţei

clasei părinte.

Page 7: PROGRAMARE ORIENTATĂ PE OBIECTE - math.uaic.romapetrii/POO/depozit/Curs6.pdf · Programare orientată pe obiecte Curs 6 1 PROGRAMARE ORIENTATĂ PE OBIECTE Funcții și clase template

Programare orientată pe obiecte Curs 6

7

Exemplu (preluat din http://www.techit.ro)

Clasă

Moştenirea este o relaţie prin care se indică faptul că o clasă moşteneşte caracteristicile clasei

părinte. În plus, clasa copil poate avea propriile caracteristici.

Asocierea arată existenţa unei relaţii între clase. În exemplul de mai jos, între Persoană şi

Autovehicul există următoarea relaţie:

o Persoană poate avea zero, unul sau mai multe Autovehicule.

În exemplul de mai jos, relaţia dintre Articol şi Lista de preţuri este de tip mai mulţi la mai mulţi:

un Articol poate să apară pe mai multe Liste şi o Listă poate avea mai multe Articole. Pe Liste

diferite Articolele pot avea preţuri diferite.

Page 8: PROGRAMARE ORIENTATĂ PE OBIECTE - math.uaic.romapetrii/POO/depozit/Curs6.pdf · Programare orientată pe obiecte Curs 6 1 PROGRAMARE ORIENTATĂ PE OBIECTE Funcții și clase template

Programare orientată pe obiecte Curs 6

8

Dependenţa indică faptul că o clasă depinde de altă clasă, în sensul în care o funcţie oarecare

depinde de un parametru al său.

Agregarea indică faptul că o clasă părinte are elemente de tipul clasei copil. În exemplul de mai

jos Ţara poate avea mai multe Judeţe dar, în acelaşi timp, un Judeţ poate exista chiar şi în cazul în

care clasa Ţara nu există.

Într-o relaţie de tip compoziţie clasa copil nu poate exista decât dacă există o instanţă a clasei

părinte. În exemplul de mai jos instanţa clasei Comisie există atâta timp cât există instanţa clasei

Examen.

Page 9: PROGRAMARE ORIENTATĂ PE OBIECTE - math.uaic.romapetrii/POO/depozit/Curs6.pdf · Programare orientată pe obiecte Curs 6 1 PROGRAMARE ORIENTATĂ PE OBIECTE Funcții și clase template

Programare orientată pe obiecte Curs 6

9

Tratarea excepțiilor

O excepție este o eroare care poate să apară la rularea unui program.

Exemple:

încercarea de deschidere a unui fișier ce nu există

depășirea limitelor unui tablou

încercarea de alocare a unui spațiu de memorie ce depășește dimensiunea heap-ului

erori aritmetice

etc.

În cazul apariției unei erori se poate afișa eroarea propriuzisă și apoi se continuă execuția sau se

termină programul după afișare. În limbajul C tratarea erorilor se făcea folosind assert. In C++

tratarea excepțiilor se face folosind try, throw şi catch. Tratarea excepţiilor în C++ este o metodă

care se aplică atunci când funcţia care detectează o eroare nu o şi tratează. Ea doar generează sau

aruncă excepţia (throw). Aruncarea unei excepții nu garantează că excepţia va fi şi tratată în afara

funcţiei. Pentru aceasta, trebuie specificată o secvenţă de cod care detectează sau prinde excepţia

şi o tratează. Programatorul trebuie să includă într-un bloc try codul care ar putea genera o eroare

generatoare a unei excepţii. Blocul try este urmat de unul sau mai multe blocuri catch. Fiecare

bloc catch specifică tipul excepţiei pe care o poate detecta și va executa blocul corespunzator

tipului excepției.

Excepţiile sunt interceptate şi prelucrate folosind construcţia try şi catch, care are sintaxa:

try{

//codul care ar putea genera erori

}

catch(Tip1 Var1){

//tratare exceptie

}

...

catch(Tipn VarN){

//tratare exceptie

}

Fiecare bloc catch are între paranteze rotunde tipul de excepţie care va fi interceptat şi prelucrat de

blocul de instrucţiuni.

Important: Blocurile try şi catch formează o singură construcţie (nu se poate folosi un bloc try

fără cel puţin un bloc catch şi nu se poate folosi un bloc catch fără un bloc try). Între cele două

blocuri nu pot exista alte secvenţe de instrucţiuni. Se pot înlănţui oricâte blocuri catch, câte unul

pentru fiecare tip de excepţie ce se doreşte a fi tratată.

Page 10: PROGRAMARE ORIENTATĂ PE OBIECTE - math.uaic.romapetrii/POO/depozit/Curs6.pdf · Programare orientată pe obiecte Curs 6 1 PROGRAMARE ORIENTATĂ PE OBIECTE Funcții și clase template

Programare orientată pe obiecte Curs 6

10

Exemplu void main(void){ cout << "Start" << endl; try { cout << "Exemplu tratare exceptii." << endl; throw 100;//lansam o exceptie cout << "Cod care nu se va executa."; } catch(int i) { cout << "Am captat exceptia care are codul: "<< i << endl; } cout << "Stop" << endl; }

Dacă în blocul catch am fi avut catch(double i) { cout << "Am captat exceptia care are codul: "<< i << endl; }

atunci excepția nu ar fi fost captata (am lansat o exceptie de tip int) și ar fi condus la o terminare

anormală a programului.

Exemplu

Fie funcţia:

int factorial(int n){ if(n<0)//aruncam o exceptie throw "Argumentul trebuie sa fie pozitiv"; if(n==0)return 1; return n*factorial(n-1); } void main(){ cout<<"Start test exceptii"<<endl; cout<<"n!="<<factorial(-5)<<endl; cout<<"Sfarsit test exceptii"<<endl; }

În acest caz ajungem la o terminare anormală a programului. Mesajul "Sfarsit test exceptii" nu

mai apare. Execuţia se întrerupe în momentul apariţiei excepţiei.

Dacă tratăm excepţia în funcţia main:

void main(){ cout<<"Start test exceptii"<<endl; try{ cout<<"n!="<<factorial(-5)<<endl; } catch(char* p){ cout<<p<<endl; } catch(int){ cout<<"O alta exceptie"; } cout<<"Sfarsit test exceptii"<<endl; }

Page 11: PROGRAMARE ORIENTATĂ PE OBIECTE - math.uaic.romapetrii/POO/depozit/Curs6.pdf · Programare orientată pe obiecte Curs 6 1 PROGRAMARE ORIENTATĂ PE OBIECTE Funcții și clase template

Programare orientată pe obiecte Curs 6

11

atunci rezultatul execuţiei va fi:

Start test exceptii

Argumentul trebuie sa fie pozitiv

Sfarsit test exceptii

Press any key to continue

Se observă apariţia mesajului Sfarsit test exceptii.

Important: Excepţiile pot fi utilizate în constructori.

Exemplu: class Test{ char* pv; public: Test(char* p) { if (p == 0 || p == "")//Nu permitem ca pv sa fie null sau sirul vid. throw invalid_argument("Argumentul este null sau blank"); else pv = p; } };

La tratarea excepțiilor pot fi folosite și clase de excepții (în locul tipurilor standard). Aceste clase

pot fi definite de utilizator sau pot fi dintre cele standard.

Exemplu:

class Vector{ static const int DMAX=100;// dimensiune maxima vector float* v; int d; // numar de elemente vector public: class Range{}; // clase exceptii class Size {}; Vector(int n); float& operator[](int i); }; Vector::Vector(int n){ if(n < 0 || n >= DMAX) throw Size(); d = n; v = new float[n]; }; float& Vector::operator[](int i){ if(i >= 0 && i < d) return v[i]; throw Range(); };

Page 12: PROGRAMARE ORIENTATĂ PE OBIECTE - math.uaic.romapetrii/POO/depozit/Curs6.pdf · Programare orientată pe obiecte Curs 6 1 PROGRAMARE ORIENTATĂ PE OBIECTE Funcții și clase template

Programare orientată pe obiecte Curs 6

12

void main(){ try{ Vector v(200); // declanseaza exceptia Size v[130] = 1.3; // declanseaza exceptia Range } catch(Vector::Size){ cout<<"Depasire dimensiune maxima admisa"<<endl; } catch(Vector::Range){ cout<<"Depasire limite tablou"<<endl; } }

Clasele de excepţii formează o ierarhie bazată pe clasa exception. Această ierarhie poate fi folosită

pentru simplificarea tratării erorilor.

Important: Dacă dorim să captăm orice excepție putem folosi blocul catch(...).

Sintaxă try{

//codul care ar putea genera erori

}

catch(Tip1 Var1){

//tratare exceptie

}

...

catch(Tipn VarN){

//tratare exceptie

}

catch(…){

// captraza orice exceptie

}

Nu este încurajată utilizarea blocului catch(...) deoarece se pierde orice informaţie despre excepţia

apărută.


Recommended