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; }
12
Embed
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
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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; }
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.
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.
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ă.
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; }
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(); };