cpp:class_templates_specialization
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| cpp:class_templates_specialization [2019/05/14 04:15] – created gthanos | cpp:class_templates_specialization [2022/05/26 10:47] (current) – [Εξειδίκευση της κλάσης Box στην περίπτωση που η παράμετρος είναι δείκτης σε χαρακτήρα] gthanos | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Εξειδίκευση ενός template ====== | + | ====== Εξειδίκευση ενός |
| - | Συχνά είναι απαραίτητο να προδιαγράψουμε διαφορετική λειτουργικότητα σε ένα template με βάση τον τύπο των δεδομένων που θα εισαχθεί τελικά στην κλάση. Για παράδειγμα, | + | ===== Εξειδίκευση της κλάσης Box στην περίπτωση που η παράμετρος είναι δείκτης ===== |
| + | |||
| + | Συχνά είναι απαραίτητο να προδιαγράψουμε διαφορετική λειτουργικότητα σε ένα template με βάση τον τύπο των δεδομένων που θα εισαχθεί τελικά στην κλάση. Για παράδειγμα, | ||
| + | |||
| + | <code cpp BoxPtr.hpp> | ||
| + | #ifndef _BOXTPTR_HPP_ | ||
| + | #define _BOXTPTR_HPP_ | ||
| - | <code cpp BoxTemplateSpecialization1.hpp> | ||
| #include " | #include " | ||
| + | |||
| template< | template< | ||
| class Box< | class Box< | ||
| Line 70: | Line 76: | ||
| return *this; | return *this; | ||
| } | } | ||
| + | #endif | ||
| </ | </ | ||
| + | |||
| + | Παρακάτω παρατίθεται κώδικας ο οποίος χρησιμοποιεί την παραπάνω εξειδίκευση του // | ||
| + | |||
| + | <code cpp BoxPtrUsage.cpp> | ||
| + | #include < | ||
| + | #include " | ||
| + | #include " | ||
| + | |||
| + | using namespace std; | ||
| + | |||
| + | int main() { | ||
| + | int a=5; | ||
| + | double d(4.23); | ||
| + | Student kate = {" | ||
| + | | ||
| + | Box< | ||
| + | Box< | ||
| + | Box< | ||
| + | Student* kate_ptr = studentBox.get(); | ||
| + | | ||
| + | cout << *kate_ptr << endl; | ||
| + | delete kate_ptr; | ||
| + | kate.setName(" | ||
| + | cout << kate << endl; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <WRAP todo 80% center round> | ||
| + | Στον παραπάνω κώδικα αντικαταστήστε την | ||
| + | < | ||
| + | *** Error in `./ | ||
| + | ======= Backtrace: ========= | ||
| + | / | ||
| + | / | ||
| + | / | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ===== Εξειδίκευση της κλάσης Box στην περίπτωση που η παράμετρος είναι δείκτης σε χαρακτήρα ===== | ||
| + | |||
| + | Το παραπάνω παράδειγμα είναι ικανοποιητικό εάν περαστεί ως δείκτης ένα αντικείμενο τύπου **int* ** ή **Student* **, όμως δεν είναι ικανοποιητικό εάν περαστεί ένας δείκτης τύπου **char* ** που αντιπροσωπεύει ένα C string. Σε αυτή την περίπτωση δεν αρκεί να δεσμευθεί η μνήμη για ένα χαρακτήρα, | ||
| + | |||
| + | <code cpp BoxCharPtr.hpp> | ||
| + | #ifndef _BOXCHARPTR_HPP_ | ||
| + | #define _BOXCHARPTR_HPP_ | ||
| + | |||
| + | #include " | ||
| + | #include < | ||
| + | |||
| + | template <> | ||
| + | class Box<char *> { | ||
| + | char *e; | ||
| + | public: | ||
| + | Box(); | ||
| + | Box(char *e); | ||
| + | ~Box(); | ||
| + | Box(const Box< | ||
| + | char* get() const; | ||
| + | void set(char *e); | ||
| + | Box< | ||
| + | friend std:: | ||
| + | }; | ||
| + | |||
| + | Box< | ||
| + | this->e = nullptr; | ||
| + | } | ||
| + | |||
| + | Box< | ||
| + | this->e = new char[strlen(e)+1]; | ||
| + | strcpy(this-> | ||
| + | } | ||
| + | |||
| + | Box< | ||
| + | this->e = new char[strlen(b.e)+1]; | ||
| + | strcpy(this-> | ||
| + | } | ||
| + | |||
| + | Box< | ||
| + | delete [] this->e; | ||
| + | } | ||
| + | |||
| + | char* Box< | ||
| + | char *ce = new char[strlen(e)+1]; | ||
| + | strcpy(ce, e); | ||
| + | return ce; | ||
| + | } | ||
| + | |||
| + | void Box<char *>:: | ||
| + | if(this-> | ||
| + | delete [] this->e; | ||
| + | this->e = new char[strlen(e)+1]; | ||
| + | strcpy(this-> | ||
| + | } | ||
| + | |||
| + | Box< | ||
| + | set(b.e); | ||
| + | return *this; | ||
| + | } | ||
| + | |||
| + | std:: | ||
| + | out << t.e; | ||
| + | return out; | ||
| + | } | ||
| + | #endif | ||
| + | </ | ||
| + | |||
| + | Παράδειγμα κώδικα που χρησιμοποιεί την παραπάνω εξειδικευμένη κλάση **Box< | ||
| + | <code cpp BoxCharPtrUsage.cpp> | ||
| + | #include < | ||
| + | |||
| + | #include " | ||
| + | |||
| + | using namespace std; | ||
| + | |||
| + | int main() { | ||
| + | char greeting[64] = " | ||
| + | | ||
| + | Box< | ||
| + | | ||
| + | char* greeting_copy = greetingBox.get(); | ||
| + | cout << greeting_copy << endl; | ||
| + | delete greeting_copy; | ||
| + | | ||
| + | Box< | ||
| + | char* msg = msgBox.get(); | ||
| + | cout << msg << endl; | ||
| + | delete msg; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <WRAP todo 80% center round> | ||
| + | Στον παραπάνω κώδικα αντικαταστήστε την εντολή ''# | ||
| + | </ | ||
cpp/class_templates_specialization.1557807309.txt.gz · Last modified: 2019/05/14 03:15 (external edit)
