Sunteți pe pagina 1din 12

Programare orientat pe obiecte

Curs 6

PROGRAMARE ORIENTAT PE OBIECTE

Funcii i clase template


O funcie template (ablon, generic) este un tipar utilizat de compilator pentru a construi
automat diverse funcii. Se utilizeaz pentru implementarea de funcii care difer doar prin tipul
parametrilor
Sintax:
template <par1, par2,..., parN>
antet_functie;
unde:
par1,,parN sunt parametrii funciei template, de regul constante sau tipuri de date
specificate prin cuvntul cheie class sau typename.
Important: Toi parametrii din lista parametrilor ablonului (template) trebuie s apar n lista de
parametri formali ai funciei template.
Sintaxa pentru apelul funcilor 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 corespunztoare de funcie.
Important: Generarea de cod pentru entitatea template are loc la compilare. La apelul funciei
parametrizate, tipul argumentelor determin care versiune a ablonului este folosit.
Exemplu:
In locul funciilor
int maxim(int x,int y){
if(x<y)return y;
return x;
}

Programare orientat pe obiecte

Curs 6

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 cuvntul cheie class sau typename.
Sintaxa pentru instaniere:
nume_clasa <tipC1,tipC2,, tipCn>
nume_obiect(lista_param_constructor);
unde tipC1, tipC2,...,tipCn sunt tipuri concrete sau constante utilizate pentru a genera
versiunea corespunztoare de funcie.
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;
}
};

Programare orientat pe obiecte

Curs 6

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

Programare orientat pe obiecte

Curs 6

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 suprancrcrii operatorului = ar fi condus la o
eroare in timpul rulrii.

Programare orientat pe obiecte

Curs 6

Diagrame UML
UML( Unified Modeling Language) este un limbaj vizual de modelare utilizat pentru specificarea,
construirea i documentarea sistemelor de aplicaii 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 (relaiile).
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 notaie grafic pentru reprezentarea
claselor (entiti ce au caracteristici comune) i relaiilor (relaiile 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 protecia atributului i poate s aib una din urmtoarele valori
+ - public
- - privat
# - protected (opional)

idAtribut este identificatorul atributului


tip este tipul acestuia
valoare_implicita reprezint valoarea iniial a atributului (opional)
5

Programare orientat pe obiecte

Curs 6

Specificarea Metodelor
Sintaxa:
vizibilitate idMetoda(idP1:tip1, ..., idPn:tipN) : tip_returnat
unde:
vizibilitate reprezint protecia atributului i poate s aib una din urmtoarele valori
+ - public
- - privat
# - protected (opional)
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 notaiile lor sunt urmtoarele:
Element

Descriere

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 operaiile specifice
clasei.

Motenire

Motenirea este o relaie care indic faptul c o clas


motenete caracteristicile unei clase printe. Sensul sgeii
indic sensul n care se poate spune despre clasa copil c este
de tipul clas printe.

Asociere

Asocierea este o relaie generic ntre dou clase. Aceste pot


defini regulile numerice de asociere (unu la unu, unu la mai
muli, mai muli la mai muli).

Notaie

Atunci cnd o clas depinde de o alt clas, n sensul c


Dependen utilizeaz acea clas ca i atribut al su, se folosete relaia de
dependen.

Agregare

Agregarea indic o relaie de tip ntreg-parte (se poate spune


despre clasa printe c are clase de tip copil). n aceast
relaie, clasa copil poate exista i fr clasa printe.

Aceast relaie deriv din agregare dar se utilizeaz atunci


Compoziie cnd o clas copil nu poate exista dect n cazul existenei
clasei printe.

Programare orientat pe obiecte

Curs 6

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


Clas

Motenirea este o relaie prin care se indic faptul c o clas motenete caracteristicile clasei
printe. n plus, clasa copil poate avea propriile caracteristici.

Asocierea arat existena unei relaii ntre clase. n exemplul de mai jos, ntre Persoan i
Autovehicul exist urmtoarea relaie:
o Persoan poate avea zero, unul sau mai multe Autovehicule.

n exemplul de mai jos, relaia dintre Articol i Lista de preuri este de tip mai muli la mai muli:
un Articol poate s apar pe mai multe Liste i o List poate avea mai multe Articole. Pe Liste
diferite Articolele pot avea preuri diferite.

Programare orientat pe obiecte

Curs 6

Dependena indic faptul c o clas depinde de alt clas, n sensul n care o funcie oarecare
depinde de un parametru al su.

Agregarea indic faptul c o clas printe are elemente de tipul clasei copil. n exemplul de mai
jos ara poate avea mai multe Judee dar, n acelai timp, un Jude poate exista chiar i n cazul n
care clasa ara nu exist.

ntr-o relaie de tip compoziie clasa copil nu poate exista dect dac exist o instan a clasei
printe. n exemplul de mai jos instana clasei Comisie exist atta timp ct exist instana clasei
Examen.

Programare orientat pe obiecte

Curs 6

Tratarea excepiilor
O excepie este o eroare care poate s apar la rularea unui program.
Exemple:
ncercarea de deschidere a unui fiier ce nu exist
depirea limitelor unui tablou
ncercarea de alocare a unui spaiu de memorie ce depete dimensiunea heap-ului
erori aritmetice
etc.

n cazul apariiei unei erori se poate afia eroarea propriuzis i apoi se continu execuia sau se
termin programul dup afiare. n limbajul C tratarea erorilor se fcea folosind assert. In C++
tratarea excepiilor se face folosind try, throw i catch. Tratarea excepiilor n C++ este o metod
care se aplic atunci cnd funcia care detecteaz o eroare nu o i trateaz. Ea doar genereaz sau
arunc excepia (throw). Aruncarea unei excepii nu garanteaz c excepia va fi i tratat n afara
funciei. Pentru aceasta, trebuie specificat o secven de cod care detecteaz sau prinde excepia
i o trateaz. Programatorul trebuie s includ ntr-un bloc try codul care ar putea genera o eroare
generatoare a unei excepii. Blocul try este urmat de unul sau mai multe blocuri catch. Fiecare
bloc catch specific tipul excepiei pe care o poate detecta i va executa blocul corespunzator
tipului excepiei.

Excepiile sunt interceptate i prelucrate folosind construcia 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 excepie care va fi interceptat i prelucrat de
blocul de instruciuni.
Important: Blocurile try i catch formeaz o singur construcie (nu se poate folosi un bloc try
fr cel puin un bloc catch i nu se poate folosi un bloc catch fr un bloc try). ntre cele dou
blocuri nu pot exista alte secvene de instruciuni. Se pot nlnui oricte blocuri catch, cte unul
pentru fiecare tip de excepie ce se dorete a fi tratat.

Programare orientat pe obiecte

Curs 6

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 excepia nu ar fi fost captata (am lansat o exceptie de tip int) i ar fi condus la o terminare
anormal a programului.
Exemplu
Fie funcia:
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


mai apare. Execuia se ntrerupe n momentul apariiei excepiei.

test exceptii"

nu

Dac tratm excepia n funcia 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;
}

10

Programare orientat pe obiecte

Curs 6

atunci rezultatul execuiei va fi:


Start test exceptii
Argumentul trebuie sa fie pozitiv
Sfarsit test exceptii
Press any key to continue
Se observ apariia mesajului Sfarsit test exceptii.
Important: Excepiile 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 excepiilor pot fi folosite i clase de excepii (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();
};

11

Programare orientat pe obiecte

Curs 6

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 excepii formeaz o ierarhie bazat pe clasa exception. Aceast ierarhie poate fi folosit
pentru simplificarea tratrii erorilor.

Important: Dac dorim s captm orice excepie 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 informaie despre excepia
aprut.
12

S-ar putea să vă placă și