• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyjątki dziedziczone z klasy exception i wirtualna funkcja what

Object Storage Arubacloud
0 głosów
700 wizyt
pytanie zadane 29 września 2017 w C i C++ przez paweljumper Obywatel (1,260 p.)
edycja 6 października 2017 przez paweljumper

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);
}

 

1 odpowiedź

+1 głos
odpowiedź 29 września 2017 przez draghan VIP (106,230 p.)
wybrane 29 września 2017 przez paweljumper
 
Najlepsza

Potrzebujesz jeszcze zdefiniować wirtualną metodę dla klasy bad_mean.

Wskazówka: w klasach pochodnych sugeruję użyć słowa kluczowego 'override' zamiast 'virtual' - łatwiej się połapać w hierarchii. :)

komentarz 29 września 2017 przez paweljumper Obywatel (1,260 p.)
Dzięki działa mam tylko jedno pytanie
virtual const char * what() { return what();}
Tak wygląda ta funkcja ale jak daje return logic_error.what() wyrzuca bład expected primary expression before . token
komentarz 29 września 2017 przez paweljumper Obywatel (1,260 p.)
O override jeszcze nie wiedziałem więc dzięki :P
komentarz 29 września 2017 przez paweljumper Obywatel (1,260 p.)
Nevermind przecież powinno być :: :p. Ale skucha
komentarz 30 września 2017 przez draghan VIP (106,230 p.)
O coś jeszcze chciałbyś zapytać w temacie? :)
komentarz 6 października 2017 przez mokrowski Mędrzec (156,220 p.)
edycja 6 października 2017 przez mokrowski
const char * what() const noexcept override { return "Inappropriate args for gmean"; }

Po C++11 jest tam sygnatura z noexcept.

oraz...

catch (const bad_mean & hg)

Łap zawsze przez stałą referencję.

Uważaj także tutaj:

double hmean(double a, double b)
{
    if (a == -b)
        throw bad_hmean(a, b);
    return 2.0 * a * b / (a + b);
}

Porównujesz dwie wartości zmiennoprzecinkowe. Możesz się zdziwić. Dokładne porównanie powinno uwzględniać std::numeric_limits::epsilon .

Podobne pytania

0 głosów
2 odpowiedzi 162 wizyt
pytanie zadane 28 listopada 2018 w PHP przez niezalogowany
+1 głos
2 odpowiedzi 178 wizyt
pytanie zadane 7 września 2020 w PHP przez Jacek Krawczyk Nowicjusz (160 p.)
+1 głos
0 odpowiedzi 101 wizyt
pytanie zadane 6 września 2020 w Algorytmy przez Damian2102 Nowicjusz (150 p.)

92,698 zapytań

141,611 odpowiedzi

320,122 komentarzy

62,057 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...