Witam. Mam problem z klasami wyjątków dziedziczącymi od klasy która przechowuje wartości. Klasa która przechowuje wartości dziedziczy z klasy logic_error. Mam jednak problem z funkcja what która dla bad_mean nie znajduje funckji z bad_gmean lub hmean tylko zawsze używa bad_mean. Chce aby uzywala funkcji odpowiedniej dla zlapanego wyjatku a przy tym zeby program korzystał z jednego bloku catch. Jest to zadanie z ksiązki jezyk c++ szkoła programowania konkretnie rozdiał 15 cwiczenie programistyczne 3
Kod:
// exc_mean.h -- klasy wyjątkow dla funkcji hmean() i gmean()
#include <iostream>
#include <string>
#include <stdexcept>
class bad_mean : public std::logic_error
{
double v1;
double v2;
public:
double getv1() const { return v1;}
double getv2() const { return v2;}
bad_mean(double a = 0, double b = 0) : std::logic_error("Inappropriate function arguments for average"), v1(a), v2(b) { }
};
class bad_hmean : public bad_mean
{
public:
bad_hmean (double a, double b) : bad_mean(a,b) { }
virtual const char * what() { return "Inappropriate args for hmean"; }
};
class bad_gmean : public bad_mean
{
public:
bad_gmean(double a, double b) : bad_mean(a,b) { }
virtual const char * what() { return "Inappropriate args for gmean"; }
};
// error4.cpp -- uzywa klas wyjatkow
#include <iostream>
#include <cmath> // lub math.h; uzytkownicy systemu UNIX moga potrzebowac opcji -lm
#include "exc_mean.h"
double hmean(double a, double b);
double gmean(double a, double b);
int main()
{
using std::cout;
using std::cin;
using std::endl;
double x, y, z;
cout << "Podaj dwie liczby: ";
while (cin >> x >> y)
{
try {
z = hmean(x, y);
cout << "Srednia harmoniczna liczb " << x << " i " << y
<< " wynosi " << z << endl;
cout << "Srednia geometryczna liczb " << x << " i " << y
<< " wynosi " << gmean(x, y) << endl;
cout << "Podaj kolejna pare liczb <w, aby wyjsc>: ";
}
catch (bad_mean & hg)
{
cout << hg.what() << endl;
cout << "Niestety, to koniec zabawy.\n";
break;
} // koniec bloku catch
}
cout << "Koniec\n";
return 0;
}
double hmean(double a, double b)
{
if (a == -b)
throw bad_hmean(a, b);
return 2.0 * a * b / (a + b);
}
double gmean(double a, double b)
{
if (a < 0 || b < 0)
throw bad_gmean(a, b);
return std::sqrt(a * b);
}