Documente Academic
Documente Profesional
Documente Cultură
Curs 6
Curs 6
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;
}
};
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;
}
Curs 6
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.
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)
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
Motenire
Asociere
Notaie
Agregare
Curs 6
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.
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.
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.
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;
}
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;
}
test exceptii"
nu
10
Curs 6
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
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