﻿
#include <iostream>
#include <exception>   // klasa exception
using namespace std;


// klasa Mianownik - wyjątek dzielenia przez zero 
// dziedziczy z bibliotecznej klasy exception
// nadpisujemy wirtualna metodę what() zdefiniowana w tej klasie
// (metoda what() zostaje przesłonięta) 
class MianownikZero : public exception {
public:
    const char* what() const throw() {
        const char* komunikat = "error, mianownik nie może byc zerem";
        return komunikat;
    }
};


// klasa Liczba - wyjątek wielkości licznika
// dziedziczy z bibliotecznej klasy exception
// nadpisujemy wirtualna metodę what() zdefiniowana w tej klasie
class LicznikZlaWielkosc : public exception {
public: 
    const char* what() const throw() {
        return "error, licznik musi byc większy od 10";
    }
};


int main()
{
    double a, b;
    cout << "podaj 2 liczby: licznik (większy od 10) i mianownik" << endl;
    cin >> a >> b;
    try {
        // sprawdzamy licznik i gdy jest za mały rzucamy wyjatek w postaci
        // obiektu klasy LicznikZlaWielkosc
        if (a <= 10) {
            throw LicznikZlaWielkosc();
        }
        // sprawdzamy mianownik i gdy jest zerem rzucamy wyjątek
        // w postaci obiektu klasy MianownikZero
        if (b == 0) {
            throw MianownikZero();
        }
        cout << "iloraz podanych liczb: " << a / b;
    }
    // łapiemy wyjątki w postaci referencji obiektów klasy exception
    // w ten sposob korzystamy z mechanizmu polimorfizmu dynamicznego
    catch(exception& e){
        // wypisujemy stosowny komunikat w zależnosci od obiektu błędu
        cout << e.what();
    }

}


