Programare Orientata pe Obiecte


Tratarea exceptiilor

Sa se implementeze clasa Persoana. O persoana este caracterizata de un nume si o varsta care poate fi un intreg in intervalul [0...150]. Clasa va pune la dispozitie o metoda care va permite schimbarea varstei. In cazul in care noua valoare specificata pentru schimbarea varstei este eronata functia va genera o exceptie VarstaInvalida.

#include <conio.h>
#include <iostream>
#include <stdexcept>

using namespace std;

class VarstaInvalida : public range_error {
		int varsta;
    public:
		VarstaInvalida(int v, char *message):varsta(v),range_error(message){
		}
		int getVarsta() const{
			return varsta;
		}
};

class Persoana {
    private:
		char nume[100];
		int varsta;
    public:
		Persoana (char *nume="", int varsta=0);
		~Persoana();
		void setNume(const char *nume);
		char *getNume();
		void setVarsta(int varsta) throw (VarstaInvalida);
		int getVarsta();
		void afisare();  
};

Persoana::Persoana(char *nume, int varsta) {
    cout<<"Apel constructor Persoana("<<nume<<","<<varsta<<")"<<endl;
    strcpy(this->nume,nume);
    setVarsta(varsta);
}
Persoana:: ~Persoana(){
    cout << "Apel destructor ~Persoana()."<<endl;
}

void Persoana::setNume(const char *nume){
    strcpy(this->nume,nume);
}
char *Persoana::getNume() {
    return nume;
}

void Persoana::setVarsta(int varsta) throw (VarstaInvalida) {
    if (varsta>=0 && varsta <= 150){
        this->varsta = varsta;
        } else {
        throw VarstaInvalida(varsta, "Valoare invalida pentru varsta");
    }
}

int Persoana::getVarsta() {
    return varsta;
}

void Persoana::afisare(){
    cout<<"Nume:"<<nume<<endl;
    cout<<"Varsta:"<<varsta<<endl;
}

void test1(Persoana &p){
    int v = -100;
    try {
        cout<<"In functia test1() setez varsta la :" << v<<endl;
        p.setVarsta(v);
        cout<<"In functia test1() varsta persoanei este:" << p.getVarsta()<<endl;
    } catch(const VarstaInvalida &e){
        cout<<e.what()<<":"<<e.getVarsta()<<endl;
    }
    cout<<"Terminare functie test1(). Varsta persoanei este:" << p.getVarsta()<<endl;
}

void test2(Persoana &p){
    int v = -100;
    try {
        cout<<"In functia test2() setez varsta la :" << v<<endl;
        p.setVarsta(v);
        cout<<"In functia test2() varsta persoanei este:" << p.getVarsta()<<endl;
    } catch(const VarstaInvalida &e){
        cout<<"Eroare prinsa in functia test2(): "<< e.what()<<":"<<e.getVarsta()<<endl;
        throw;  //Retransmitere eroare.
    }
    cout<<"Terminare functie test1(). Varsta persoanei este:" << p.getVarsta()<<endl;
}

void test3(Persoana &p){
    int v = -100;
    cout<<"In functia test3() setez varsta la :" << v<<endl;
    p.setVarsta(v);
    cout<<"Terminare functie test3(). Varsta persoanei este:" << p.getVarsta()<<endl;
}

void gestioneaza_exceptii_netratate() {
    cout << "Apel functie gestioneaza_exceptii_netratate" << endl;
};

int main (){
    set_terminate(gestioneaza_exceptii_netratate);//Seteaza functia ce se va apela in cazul aparitiei unei exceptii netratate
    Persoana p("Maria", 2);
    p.afisare();
    int v;
    try {
        v = 10;
        cout<<"Setez varsta persoanei la: "<<v<<endl;
        p.setVarsta(10);
        cout<<"Varsta persoanei a fost setata la: " <<p.getVarsta()<<endl;
    } catch(const VarstaInvalida &e){
        cout<<e.what()<<":"<<e.getVarsta()<<endl;
    }
    p.afisare();
    try {
        v = -1;
        cout<<"Setez varsta persoanei la: "<<v<<endl;
        p.setVarsta(v);
        cout<<"Varsta persoanei a fost setata la: " <<p.getVarsta()<<endl;
        } catch(const VarstaInvalida &e){
        cout<<e.what()<<":"<<e.getVarsta()<<endl;
    }
    p.afisare();
    
    try {
        v = 200;
        cout<<"Setez varsta persoanei la: "<<v<<endl;
        p.setVarsta(v);
        cout<<"Varsta persoanei a fost setata la: " <<p.getVarsta()<<endl;
    } catch(...){
        cout<< "O eroare a aparut la setarea varstei ... "<<endl;
        
    }
    test1(p);
    try {
        test2(p);
    } catch (const VarstaInvalida &e){
        cout<< "O eroare a aparut apelul functiei test2(): "<<e.what()<<endl;
    }
    try {
        test3(p);
    } catch (const VarstaInvalida &e){
        cout<< "O eroare a aparut apelul functiei test3():"<<e.what()<<endl;
    }
    //test3(p); /*1*/
    return 0;
}

In urma rularii programului se obtine urmatorul output:

Apel constructor Persoana(Maria,2)
Nume:Maria
Varsta:2
Setez varsta persoanei la: 10
Varsta persoanei a fost setata la: 10
Nume:Maria
Varsta:10
Setez varsta persoanei la: -1
Valoare invalida pentru varsta:-1
Nume:Maria
Varsta:10
Setez varsta persoanei la: 200
O eroare a aparut la setarea varstei ... 
In functia test1() setez varsta la :-100
Valoare invalida pentru varsta:-100
Terminare functie test1(). Varsta persoanei este:10
In functia test2() setez varsta la :-100
Eroare prinsa in functia test2(): Valoare invalida pentru varsta:-100
O eroare a aparut apelul functiei test2(): Valoare invalida pentru varsta
In functia test3() setez varsta la :-100
O eroare a aparut apelul functiei test3():Valoare invalida pentru varsta
Apel destructor ~Persoana().   

Tema

  1. Explicati output-ul programului prezentat mai sus.

  2. Decomentati linia marcata cu /*1*/ rulati programul si explicati output-ul.

  3. Implementati clasa Cantar. Un cantar are o capacitate maxima admisa. Daca se incearca cantarirea unui obiect ce depaseste cu maxim 10% greutatea maxima admisa se va genera exceptia AvertismentDepasireGreutate iar daca se depasete si acesta limita se va genera eroarea DepasireGreutate.

  4. Implementati clasa Stiva implementata sub forma unui tablou alocat dinamic. Gestionati exceptiile ce pot aparea.