This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
|
cpp:function_try_blocks [2019/05/06 15:12] gthanos [Function Try Blocks] |
cpp:function_try_blocks [2019/05/15 08:27] gthanos [Exception που συμβαίνουν στον κατασκευαστή της προγόνου κλάσης] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Εξαιρέσεις στον κατασκευαστή ====== | + | ====== Εξαιρέσεις |
| Ας υποθέσουμε ότι έχουμε την παρακάτω κλάση //Name// η οποία περιγράφει ένα όνομα | Ας υποθέσουμε ότι έχουμε την παρακάτω κλάση //Name// η οποία περιγράφει ένα όνομα | ||
| <code cpp Name.hpp> | <code cpp Name.hpp> | ||
| + | #include < | ||
| + | |||
| class Name { | class Name { | ||
| char* name; | char* name; | ||
| Line 39: | Line 41: | ||
| και την κλάση //Person// η οποία περιγράφει έναν άνθρωπο. Η κλάση διαθέτει τα εξής δύο πεδία: | και την κλάση //Person// η οποία περιγράφει έναν άνθρωπο. Η κλάση διαθέτει τα εξής δύο πεδία: | ||
| <code cpp> | <code cpp> | ||
| - | Name* firstname; | + | Name* firstname; |
| - | Name lastname; | + | Name lastname; |
| </ | </ | ||
| - | Επιπλέον ο κατασκευαστή της κλάση Person παράγει ένα // | + | Επιπλέον ο κατασκευαστή της κλάση Person παράγει ένα // |
| - | + | ||
| - | <code cpp BadName.hpp> | + | |
| - | class BadName : public std:: | + | |
| - | public: | + | |
| - | const char* what() { | + | |
| - | return " | + | |
| - | } | + | |
| - | }; | + | |
| - | </ | + | |
| <code cpp Person.hpp> | <code cpp Person.hpp> | ||
| Line 79: | Line 72: | ||
| delete firstname; | delete firstname; | ||
| } | } | ||
| + | </ | ||
| + | |||
| + | <code cpp BadName.hpp> | ||
| + | class BadName : public std:: | ||
| + | public: | ||
| + | const char* what() { | ||
| + | return " | ||
| + | } | ||
| + | }; | ||
| </ | </ | ||
| Εάν μεταγλωττίσουμε και εκτελέσουμε την παρακάτω συνάρτηση //main// ο κώδικας εκτυπώνει τα εξής: | Εάν μεταγλωττίσουμε και εκτελέσουμε την παρακάτω συνάρτηση //main// ο κώδικας εκτυπώνει τα εξής: | ||
| <code cpp main.cpp> | <code cpp main.cpp> | ||
| + | #include < | ||
| + | using namespace std; | ||
| + | |||
| + | #include " | ||
| + | |||
| int main() { | int main() { | ||
| try { | try { | ||
| Line 99: | Line 106: | ||
| Name destructor: Snow | Name destructor: Snow | ||
| Name destructor: Snow | Name destructor: Snow | ||
| - | Occured: BadName | + | Exception occured: BadName |
| </ | </ | ||
| - | Παρατηρήστε ότι καταστρέφεται το αντικείμενο // | + | Από τις εκτυπώσεις, |
| + | |||
| + | Ως εκ τούτου, | ||
| <WRAP tip 80% center round> | <WRAP tip 80% center round> | ||
| - | Ο λόγος που εκτυπώνεται 2 φορές το μήνυμα **" | + | Ο λόγος που εκτυπώνεται 2 φορές το μήνυμα **" |
| </ | </ | ||
| ===== Function Try Blocks ===== | ===== Function Try Blocks ===== | ||
| - | Προκειμένου να λυθεί το συγκεκριμένο πρόβλημα η //C++// υποστηρίζει τα λεγόμενα //function try blocks//. Ουσιάστικά πρόκειται για μία ειδική σύνταξη //try - catch// που περιλαμβάνει το σύνολο του κατασκευαστή, | + | Προκειμένου να λυθεί το συγκεκριμένο πρόβλημα η //C++// υποστηρίζει τα λεγόμενα //function try blocks//. Ουσιαστικά πρόκειται για μία ειδική σύνταξη //try - catch// που περιλαμβάνει το σύνολο του κατασκευαστή, |
| <code cpp > | <code cpp > | ||
| Line 121: | Line 130: | ||
| } | } | ||
| catch(BadName& | catch(BadName& | ||
| - | cout << " | + | cout << "\n--> firstname deleted!" |
| delete firstname; | delete firstname; | ||
| } | } | ||
| </ | </ | ||
| - | Εάν ανανεώσετε τον κώδικα του κατασκευαστή τώρα το πρόγραμμα σας τυπώνει: | + | Εάν ανανεώσετε τον κώδικα του κατασκευαστή τώρα το πρόγραμμα σας |
| < | < | ||
| Line 135: | Line 144: | ||
| Name destructor: Snow | Name destructor: Snow | ||
| Name destructor: Snow | Name destructor: Snow | ||
| + | |||
| --> firstname deleted! | --> firstname deleted! | ||
| Name destructor: John | Name destructor: John | ||
| - | Occured: BadName | + | Exception occured: BadName |
| </ | </ | ||
| - | < | + | < |
| - | Παρατηρήστε ότι αν και εκτελείται ο κώδικας μέσα στο //catch block//, η εξαίρεση " | + | Παρατηρήστε ότι αν και εκτελείται ο κώδικας μέσα στο //catch block//, η εξαίρεση " |
| </ | </ | ||
| - | ===== Exception που συμβαίνουν στον κατασκευαστή προγόνου κλάσης ===== | + | ===== Exception που συμβαίνουν στον κατασκευαστή |
| - | Ας υποθέσουμε την κλάση //Student// που είναι απόγοντος της κλάσης //Person// και δηλώνεται ως εξής: | + | Ας υποθέσουμε την κλάση //Student// που είναι απόγονος της κλάσης //Person// και δηλώνεται ως εξής: |
| <code cpp Student.hpp> | <code cpp Student.hpp> | ||
| - | Student:: | + | class Student: public Person { |
| + | int aem; | ||
| + | public: | ||
| + | Student(const char *first, const char *last, int id); | ||
| + | }; | ||
| + | |||
| + | Student:: | ||
| cout << " | cout << " | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Εάν επιθυμούμε να " | ||
| + | |||
| + | <code cpp Student.hpp> | ||
| + | class Student: public Person { | ||
| + | int aem; | ||
| + | public: | ||
| + | Student(const char *first, const char *last, int id); | ||
| + | }; | ||
| + | |||
| + | Student:: | ||
| + | cout << " | ||
| + | } | ||
| + | catch(BadName& | ||
| + | cout << " | ||
| + | delete firstname; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Η παραπάνω σύνταξη επιτρέπει να πιάσουμε το exception που συμβαίνει στον κατασκευαστή της προγόνου κλάσης. Και εδώ το // | ||
| + | |||
| + | Η μέθοδος //main// δίνεται παρακάτω: | ||
| + | |||
| + | <code cpp main.cpp> | ||
| + | #include < | ||
| + | using namespace std; | ||
| + | |||
| + | #include " | ||
| + | #include " | ||
| + | |||
| + | int main() { | ||
| + | try { | ||
| + | Student johnSnow(" | ||
| + | } catch(BadName& | ||
| + | cout << " | ||
| + | } | ||
| } | } | ||
| </ | </ | ||