TheBestNapoli
06-04-2011, 16:22
Ciao a tutti, ho un esercizio che dice:
Scrivete un programma per verificare che tutti i distruttori degli oggetti creati in un blocco sono chiamati prima che venga lanciata un'eccezione di tale blocco. Si adoperi la classe rational come esempio.
In pratica dovrebbe essere un esercizio semplice, infatti basta creare la classe Rational (che ho già fatto anche con l'overloading degli operatori), inserire nel distruttore un cout e lanciare una qualsiasi eccezione per vedere se il distruttore viene chiamato prima del lancio dell'eccezione.
Ho supposto che l'eccezione che bisogna gestire nella classe Rational sia la divisione per zero e quindi l'header.h è questo
#include <iostream>
using namespace std;
class Rational{
friend Rational operator+(const Rational &, const Rational &);
friend Rational operator-(const Rational &, const Rational &);
friend Rational operator*(const Rational &, const Rational &);
friend Rational operator/(const Rational &, const Rational &);
friend ostream &operator<<(ostream &, const Rational&);
public:
Rational(int n = 0, int d = 1): num(n), den(d){}
~Rational(){cout<<"Distruttore\n";}
private:
int num, den;
int gcd(int j, int k){if(k==0)return j; return gcd(k,j%k);}
void reduce(){int g=gcd(num, den); num/=g; den/=g;}
};
class DivideByZero{
public:
DivideByZero(): message("Denominatore uguale a zero!"){}
const char *what() const {return message;}
private:
const char *message;
};
nel main dove lancio l'eccezione per verificare se il numeratore è uguale a zero? Forse non mi conviene fare il costruttore di default? Mi conviene fare un costruttore normale in cui posso inserire da tastiera i valori? (A quel punto credo sia banale il lancio dell'eccezione)
#include "header.h"
int main()
{
//manca il throw!
try
{
Rational x(3,2), y(5,9), z;
cout<<"x = "<<x<<endl;
cout<<"y = "<<y<<endl;
z = x + y;
cout<<"z = x + y = "<<z<<endl;
z = x - y;
cout<<"z = x - y = "<<z<<endl;
z = x * y;
cout<<"z = x * y = "<<z<<endl;
z = x / y;
cout<<"z = x / y = "<<z<<endl;
}
catch(DivideByZero &ecc)
{
cout<<"ERRORE: "<<ecc.what()<<endl;
}
return 0;
}
Grazie a tutti.
Scrivete un programma per verificare che tutti i distruttori degli oggetti creati in un blocco sono chiamati prima che venga lanciata un'eccezione di tale blocco. Si adoperi la classe rational come esempio.
In pratica dovrebbe essere un esercizio semplice, infatti basta creare la classe Rational (che ho già fatto anche con l'overloading degli operatori), inserire nel distruttore un cout e lanciare una qualsiasi eccezione per vedere se il distruttore viene chiamato prima del lancio dell'eccezione.
Ho supposto che l'eccezione che bisogna gestire nella classe Rational sia la divisione per zero e quindi l'header.h è questo
#include <iostream>
using namespace std;
class Rational{
friend Rational operator+(const Rational &, const Rational &);
friend Rational operator-(const Rational &, const Rational &);
friend Rational operator*(const Rational &, const Rational &);
friend Rational operator/(const Rational &, const Rational &);
friend ostream &operator<<(ostream &, const Rational&);
public:
Rational(int n = 0, int d = 1): num(n), den(d){}
~Rational(){cout<<"Distruttore\n";}
private:
int num, den;
int gcd(int j, int k){if(k==0)return j; return gcd(k,j%k);}
void reduce(){int g=gcd(num, den); num/=g; den/=g;}
};
class DivideByZero{
public:
DivideByZero(): message("Denominatore uguale a zero!"){}
const char *what() const {return message;}
private:
const char *message;
};
nel main dove lancio l'eccezione per verificare se il numeratore è uguale a zero? Forse non mi conviene fare il costruttore di default? Mi conviene fare un costruttore normale in cui posso inserire da tastiera i valori? (A quel punto credo sia banale il lancio dell'eccezione)
#include "header.h"
int main()
{
//manca il throw!
try
{
Rational x(3,2), y(5,9), z;
cout<<"x = "<<x<<endl;
cout<<"y = "<<y<<endl;
z = x + y;
cout<<"z = x + y = "<<z<<endl;
z = x - y;
cout<<"z = x - y = "<<z<<endl;
z = x * y;
cout<<"z = x * y = "<<z<<endl;
z = x / y;
cout<<"z = x / y = "<<z<<endl;
}
catch(DivideByZero &ecc)
{
cout<<"ERRORE: "<<ecc.what()<<endl;
}
return 0;
}
Grazie a tutti.