cpp:exception_inheritance
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| cpp:exception_inheritance [2019/05/06 08:03] – gthanos | cpp:exception_inheritance [2023/05/15 14:08] (current) – gthanos | ||
|---|---|---|---|
| Line 3: | Line 3: | ||
| Ας υποθέσουμε ότι έχουμε τη σχέση κληρονομικότητας μεταξύ των κλάσεων **BaseException** και **DerivedException**, | Ας υποθέσουμε ότι έχουμε τη σχέση κληρονομικότητας μεταξύ των κλάσεων **BaseException** και **DerivedException**, | ||
| - | <code cpp BaseException.h> | + | <code cpp BaseException.hpp> |
| using namespace std; | using namespace std; | ||
| - | class BaseException: public std:: | + | class BaseException { |
| protected: | protected: | ||
| int a; | int a; | ||
| Line 12: | Line 12: | ||
| public: | public: | ||
| BaseException(int a) { this->a = a; } | BaseException(int a) { this->a = a; } | ||
| - | | + | |
| sprintf(s, " | sprintf(s, " | ||
| return s; | return s; | ||
| Line 19: | Line 19: | ||
| </ | </ | ||
| - | <code cpp DerivedException.h> | + | <code cpp DerivedException.hpp> |
| - | #include " | + | #include " |
| using namespace std; | using namespace std; | ||
| Line 27: | Line 27: | ||
| public: | public: | ||
| DerivedException(int a, int b): BaseException(a) { this->b = b; } | DerivedException(int a, int b): BaseException(a) { this->b = b; } | ||
| - | | + | char* message() { |
| sprintf(s, " | sprintf(s, " | ||
| return s; | return s; | ||
| Line 36: | Line 36: | ||
| <code cpp ExceptionUse.cpp> | <code cpp ExceptionUse.cpp> | ||
| #include < | #include < | ||
| - | #include " | + | #include " |
| using namespace std; | using namespace std; | ||
| Line 55: | Line 55: | ||
| } | } | ||
| } catch(BaseException ex) { | } catch(BaseException ex) { | ||
| - | cout << ex.what(); | + | cout << ex.message(); |
| } catch(DerivedException ex) { | } catch(DerivedException ex) { | ||
| - | cout << ex.what(); | + | cout << ex.message(); |
| } | } | ||
| return 0; | return 0; | ||
| Line 85: | Line 85: | ||
| </ | </ | ||
| - | Παρατηρήστε ότι ενώ στην 2η περίπτωση παράγεται ένα // | + | Παρατηρήστε ότι ενώ στην 2η περίπτωση παράγεται ένα // |
| Η απάντηση στο παραπάνω ερώτημα είναι ότι αν και παράγεται ένα αντικείμενο τύπου // | Η απάντηση στο παραπάνω ερώτημα είναι ότι αν και παράγεται ένα αντικείμενο τύπου // | ||
| - | Ο τρόπος για να δουλέψει σωστά ο παραπάνω κώδικας είναι μέσα στο //catch block// να μην περάσουμε το αντικείμενο γιατί δημιουργείται αντίγραφο, | + | Ο τρόπος για να δουλέψει σωστά ο παραπάνω κώδικας είναι μέσα στο //catch block// να μην περάσουμε το αντικείμενο γιατί δημιουργείται αντίγραφο |
| <code cpp ExceptionUse.cpp> | <code cpp ExceptionUse.cpp> | ||
| #include < | #include < | ||
| - | #include " | + | #include " |
| using namespace std; | using namespace std; | ||
| Line 112: | Line 112: | ||
| } | } | ||
| } catch(BaseException &ex) { | } catch(BaseException &ex) { | ||
| - | cout << ex.what(); | + | cout << ex.message(); |
| } catch(DerivedException &ex) { | } catch(DerivedException &ex) { | ||
| - | cout << ex.what(); | + | cout << ex.message(); |
| } | } | ||
| return 0; | return 0; | ||
| Line 131: | Line 131: | ||
| <WRAP tip 80% center round> | <WRAP tip 80% center round> | ||
| - | Το πιάσιμο μιας εξαίρεσης με χρήση αναφοράς για αντικείμενα σύνθετου τύπου (όχι char, int, long, double κλπ), διότι //α)// αποφεύγουμε την αντιγραφή του αντικειμένου μέσα στο //catch block// (πιο γρήγορος κώδικας) και //β)// αποφεύγουμε την " | + | Συνιστάται, η διαχείριση |
| </ | </ | ||
cpp/exception_inheritance.1557129798.txt.gz · Last modified: 2019/05/06 07:03 (external edit)
