Sunteți pe pagina 1din 4

Funcii Identice

Soluie

Difer tipul unor parametri

int max(int n, int t[]){


int m=t[0];
for(int i=1;i<n;i++){
if(t[i]>m)
m=t[i];
}
return m;
}

Funcii i Clase
Template

float max(int n, float t[]){


float m=t[0];
for(int i=1;i<n;i++){
if(t[i]>m)
m=t[i];
}
return m;
}

int main(){
int a[3]={2,1,9};
float b[4]={3.0,1.2,4.8,1.9};
cout<<max(3,a)<<endl;;
cout<<max(4,b);
getch();
}

Mihai Gabroveanu

Funcii i Clase Template

Funcii i Clase Template

Problema I
n

S se realizeze o funcie care s calculeze


maximul dintr-un ir de elemente

Un template (ablon) definete o familie de


funcii, respectiv de clase generice
(parametrizate) utiliznd tipurile ca parametri
n Reprezint o alt tehnic de reutilizarea a
codului.
n

elementele

sunt numere ntregi


elementele sunt numere reale
. . .

Funcii i Clase Template

Funcii i Clase Template

Funcii Template
n
n
n

Generarea Funciilor 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_funcie_parametrizat;
unde:
par1, par2,..., parn sunt parametrii funciei template, de regul contante sau
tipuri de date specificate prin cuvntul cheie class sau typename.
Parametrii din lista parametrilor ablonului (template) trebuie s apar
toi n lista de parametri formali ai funciei template

Funcii i Clase Template

Apelul Funcilor Template


n

Funcii i Clase Template

Exemplu: Soluie II
template <class T>
T max(int n, T t[]){
T m=t[0];
for(int i=1;i<n;i++){
if(t[i]>m)
m=t[i];
}
return m;
}

Sintaxa apelului unei funcii template:


nume_funcie_parametrizata(expr1, expr2,...,exprn)

unde expr1, expr2,...,exprn sunt expresii din care


se deduc tipurile concrete
sau
nume_funcie_parametrizata<tipC1,tipC2,, tipCn>(lista_parametrii)

int main(){
int a[3]={2,1,9};
float b[4]={3.0,1.2,4.8,1.9};
cout<<max<int>(3,a)<<endl;
cout<<max<float>(4,b)<<endl;
cout<<max(3,a)<<endl; //tipul este dedus din tipul elemen. lui a
getch();
}

unde tipC1, tipC2,...,tipCn sunt tipuri concrete sau


constante utilizate pentru a genera versiunea
corespunztoare de funcie

Funcii i Clase Template

Generarea de cod pentru entitatea template


are loc la compilare.
n La apelul funciei parametrizate, tipul
argumentelor determin care versiune a
ablonului este folosit.
n

Funcii i Clase Template

Problema II
n

Clase Template
n

S se implementeze o clas ce
implementeaz noiunea de Vector cu
elemente numere reale.

Funcii i Clase Template

Soluie

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;
par1, par2,..., parn sunt parametrii clasei template, de
regul contante sau tipuri de date specificate prin
cuvntul cheie class sau typename.
Funcii i Clase Template

11

Instanierea Claselor Template

class Vector {
private:
float elem[MAX];
int n;
public:
Vector(int n);
int getNrElemente() const;
float& operator[] (int i);
void print();
};
Vector::Vector(int n){
this->n = n;
if(n>MAX)
throw out_of_range("Depasire dimensiune
maxima");
}
int Vector::getNrElemente() const {
return n;
}
float& Vector::operator[] (int i) {
if (i >= 0 && i < n){
return elem[i];

} else {
throw out_of_range("Depasire limite");
}
}
void Vector::print(){
int i;
for (i = 0; i < n; i++){
cout << elem[i]<<" ";
}
cout<<endl;
}

Sintaxa instanierii unei clase template:


nume_clas <tipC1,tipC2,, tipCn> nume_obiect(lista_param_constructor);

int main() {
Vector v(5);
for(int i = 0; i < v.getNrElemente(); i++) {
v[i] = i/2.0;
}
v.print();
getch();
return 0;
}

unde tipC1, tipC2,...,tipCn sunt tipuri


concrete sau constante utilizate pentru a
genera versiunea corespunztoare de funcie

Ce se ntmpl dac dorim un tablou cu numere ntregi sau crile dintr-o bibiotec?
Funcii i Clase Template

10

Funcii i Clase Template

12

Exemplu

Exemplu (cont.)

template <class T>


class Vector {
private:
T elem[MAX];
int n;
public:
Vector(int n);
int getNrElemente() const;
T& operator[] (int i);
void print();
};
template <class T>
Vector<T>::Vector<T>(int n){
this->n = n;
if(n>MAX)
throw out_of_range("Depasire dimensiune
maxima");
}

template <class T>


int Vector<T>::getNrElemente() const {
return n;
}
template <class T>
T& Vector<T>:: operator[] (int i) {
if (i >= 0 && i < n){
return elem[i];
} else {
throw out_of_range("Depasire limite");
}
}
template <class T>
void Vector<T>::print(){
int i;
for (i = 0; i < n; i++){
cout << elem[i]<<" ";
}
cout<<endl;
}

Funcii i Clase Template

13

Exemplu (cont.)

ostream& operator<<(ostream& out, const Carte&c){


out<<"Titlu:"<<c.titlu<<endl;
out<<"Autor:"<<c.autor<<endl;
}
int main() {
Vector<Carte> v(2);
v[0]=Carte("Limbajul C+", "L. Negrescu");
v[1]=Carte("Limbajul C++", "I. Muslea");
v.print();
getch();
return 0;
}

Funcii i Clase Template

15

Tem
n

int main() {
Vector<int> vi(5);
for(int i = 0; i < vi.getNrElemente(); i++) {
vi[i] = i * i;
}
vi.print();
Vector<float> vf(5);
for(int i = 0; i < vf.getNrElemente(); i++) {
vf[i] = i/2.0;
}
vf.print();
getch();
return 0;
}

Funcii i Clase Template

class Carte{
private:
char titlu[100];
char autor[100];
public:
Carte(char *titlu="", char *autor=""){
strcpy(this->titlu, titlu);
strcpy(this->autor, autor);
}
friend ostream& operator << (ostream& out,
const Carte& c);
};

14

Implementati clasa Multime care sa poata


retina elemente de orice tip. Sa se
suparaincarce operatorii +, * pentru a realiza
reuniunea respectiv intersectia a doua
multimi.
Implementati clasa generic (template) care
sa implementeze un arbore binar.
Funcii i Clase Template

16