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

Zgłaszanie wyjątków

Object Storage Arubacloud
0 głosów
146 wizyt
pytanie zadane 18 czerwca 2018 w C i C++ przez 99xkubax99 Obywatel (1,780 p.)
#include <iostream>
#include <stdexcept>
using namespace std;

class w1: public std::logic_error
{
	public:
	w1():logic_error("logic error"){}
	const char * what(){
		return "wyjatek w1"; 
	}
};

class w2: public w1
{
	public:
	const char * what(){
		return "wyjatek w2"; 
	}
};

void f1(){
	throw w2();
}

int main(){
	try{
		f1();
	}
	catch(logic_error&e){
		cout << e.what();
	}
	return 0;
}

Witam,

Mój problem wygląda następująco: klasa w1 dziedziczy z klasy logic_error natomiast klasa w2 dziedziczy z klasy w1. Jako że logic_error nie posiada konstruktora domyślnego, konstruktor klasy w1 musi wywoływać listą konstruktor logic_error(const char*). Następnie mam funkcję f1(), która rzuca jako wyjątek obiekt klasy w2. W mainie łapię ten wyjątek i tutaj pojawia się coś czego nie rozumiem. Jeżeli dam jako argument do złapania referencję do obiektu klasy w2, wtedy cout << e.what() powoduje oczywiście wypisanie łańcucha znaków "wyjątek w2". Jeżeli natomiast chciałbym "łapać" wszystkie wyjątki które mają jako klasę bazową logic_error, zatem catch(logic_error&e) i zostanie tam przekazany jako wyjątek obiekt klasy pochodnej w2, wtedy cout << e.what() powoduje wypisanie łańcucha znaków "logic error", jaki to przekazałem w konstruktorze klasy w1. Nie mam bladego pojęcia dlaczego tak się dzieje, oczekiwałem również otrzymania łancucha znaków "wyjątek w2", ponieważ mogę przekazywać obiekt w2, kiedy jako argument jest referencja klasy bazowej. Czy ktoś jest w stanie mi to wytłumaczyć? Dziękuję z góry

1 odpowiedź

+1 głos
odpowiedź 18 czerwca 2018 przez adrian17 Ekspert (344,860 p.)
wybrane 28 czerwca 2018 przez 99xkubax99
 
Najlepsza

Próbujesz przeciążyć wirtualne what() z biblioteki standardowej - OK. Tutaj znacząco pomogłoby oznaczenie tego, że Twoje what() jest przeciążeniem metody klasy bazowej - jest to opcjonalne, ale pomaga znacząco w znajdowaniu bugów.

    const char * what() override {
        return "wyjatek w1"; 
    }

Po zrobieniu tego, dostajesz ładny komunikat kompilatora:

main.cpp:9:18: error: ‘const char* w1::what()’ marked ‘override’, but does not override
     const char * what() override{
                  ^~~~

Czyli, jak się okazuje, wcale nie przeciążyłeś metody klasy bazowej. Dlaczego? Bo ma inną sygnaturę.

http://en.cppreference.com/w/cpp/error/exception/what

`const` na końcu też musi się znaleźć.

komentarz 18 czerwca 2018 przez 99xkubax99 Obywatel (1,780 p.)
Wszystko jasne, wielkie dzięki! :)

Podobne pytania

0 głosów
0 odpowiedzi 52 wizyt
+1 głos
0 odpowiedzi 212 wizyt
pytanie zadane 21 marca 2023 w C# przez Pawel1995 Gaduła (3,810 p.)
+1 głos
0 odpowiedzi 218 wizyt
pytanie zadane 2 listopada 2020 w C# przez XavRock Obywatel (1,390 p.)

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...