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:01] – 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; | ||
| + | char s[64]; | ||
| public: | public: | ||
| BaseException(int a) { this->a = a; } | BaseException(int a) { this->a = a; } | ||
| - | | + | |
| - | char *s = new char [64]; | + | |
| 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() { |
| - | char *s = new char [64]; | + | |
| sprintf(s, " | sprintf(s, " | ||
| return s; | return s; | ||
| Line 37: | Line 36: | ||
| <code cpp ExceptionUse.cpp> | <code cpp ExceptionUse.cpp> | ||
| #include < | #include < | ||
| - | #include " | + | #include " |
| using namespace std; | using namespace std; | ||
| Line 45: | Line 44: | ||
| cout << "Enter option (1-2): "; | cout << "Enter option (1-2): "; | ||
| cin >> option; | cin >> option; | ||
| - | BaseException | + | BaseException |
| - | DerivedException | + | DerivedException |
| switch(option) { | switch(option) { | ||
| case 1: | case 1: | ||
| - | throw bex; | + | throw baseEx; |
| break; | break; | ||
| case 2: | case 2: | ||
| - | throw dex; | + | throw derivedEx; |
| break; | break; | ||
| } | } | ||
| } 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 86: | 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 113: | 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 132: | Line 131: | ||
| <WRAP tip 80% center round> | <WRAP tip 80% center round> | ||
| - | Το πιάσιμο μιας εξαίρεσης με χρήση αναφοράς για αντικείμενα σύνθετου τύπου (όχι char, int, long, double κλπ), διότι //α)// αποφεύγουμε την αντιγραφή του αντικειμένου μέσα στο //catch block// (πιο γρήγορος κώδικας) και //β)// αποφεύγουμε την " | + | Συνιστάται, η διαχείριση |
| </ | </ | ||
cpp/exception_inheritance.1557129690.txt.gz · Last modified: 2019/05/06 07:01 (external edit)
