cpp:class_templates_specialization
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
cpp:class_templates_specialization [2019/05/14 10:37] – gthanos | cpp:class_templates_specialization [2022/05/26 10:47] (current) – [Εξειδίκευση της κλάσης Box στην περίπτωση που η παράμετρος είναι δείκτης σε χαρακτήρα] gthanos | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Εξειδίκευση ενός υφιστάμενου template ====== | ====== Εξειδίκευση ενός υφιστάμενου template ====== | ||
+ | |||
+ | ===== Εξειδίκευση της κλάσης Box στην περίπτωση που η παράμετρος είναι δείκτης ===== | ||
Συχνά είναι απαραίτητο να προδιαγράψουμε διαφορετική λειτουργικότητα σε ένα template με βάση τον τύπο των δεδομένων που θα εισαχθεί τελικά στην κλάση. Για παράδειγμα, | Συχνά είναι απαραίτητο να προδιαγράψουμε διαφορετική λειτουργικότητα σε ένα template με βάση τον τύπο των δεδομένων που θα εισαχθεί τελικά στην κλάση. Για παράδειγμα, | ||
Line 6: | Line 8: | ||
#ifndef _BOXTPTR_HPP_ | #ifndef _BOXTPTR_HPP_ | ||
#define _BOXTPTR_HPP_ | #define _BOXTPTR_HPP_ | ||
+ | |||
#include " | #include " | ||
+ | |||
template< | template< | ||
class Box< | class Box< | ||
Line 77: | Line 81: | ||
Παρακάτω παρατίθεται κώδικας ο οποίος χρησιμοποιεί την παραπάνω εξειδίκευση του // | Παρακάτω παρατίθεται κώδικας ο οποίος χρησιμοποιεί την παραπάνω εξειδίκευση του // | ||
- | </code cpp BoxPtr.hpp> | + | <code cpp BoxPtrUsage.cpp> |
- | #ifndef _BOXTPTR_HPP_ | + | #include < |
- | #define _BOXTPTR_HPP_ | + | #include " |
- | #include "Box.hpp" | + | #include "Student.hpp" |
- | template< | + | using namespace |
- | class Box< | + | |
- | T *e; | + | |
- | public: | + | |
- | Box(); | + | |
- | Box(T* e); | + | |
- | Box(const Box< | + | |
- | ~Box(); | + | |
- | T* get() const; | + | |
- | void set(T* e); | + | |
- | template < | + | |
- | friend | + | |
- | Box< | + | |
- | }; | + | |
- | template | + | int main() { |
- | Box<T*>::Box() { | + | int a=5; |
- | | + | double d(4.23); |
+ | Student kate = {" | ||
+ | |||
+ | Box<int*> intBox(& | ||
+ | Box<double*> doubleBox(&d); | ||
+ | | ||
+ | Student* kate_ptr | ||
+ | |||
+ | cout << *kate_ptr << endl; | ||
+ | delete kate_ptr; | ||
+ | kate.setName(" | ||
+ | cout << kate << endl; | ||
} | } | ||
- | |||
- | template < | ||
- | Box< | ||
- | this->e = new T; | ||
- | *(this-> | ||
- | } | ||
- | |||
- | template < | ||
- | Box< | ||
- | this->e = new T; | ||
- | *(this-> | ||
- | } | ||
- | |||
- | template < | ||
- | Box< | ||
- | std::cerr << "Box destructor: " << *e << std::endl; | ||
- | delete this->e; | ||
- | } | ||
- | |||
- | template < | ||
- | T* Box< | ||
- | T *ce = new T; | ||
- | *ce = *e; | ||
- | return ce; | ||
- | } | ||
- | |||
- | template < | ||
- | void Box< | ||
- | if(this-> | ||
- | delete this->e; | ||
- | this->e = new T; | ||
- | *(this-> | ||
- | } | ||
- | |||
- | template < | ||
- | std:: | ||
- | T* ptr = t.get(); | ||
- | out << *ptr; | ||
- | delete ptr; | ||
- | return out; | ||
- | } | ||
- | |||
- | template < | ||
- | Box< | ||
- | set(b.e); | ||
- | return *this; | ||
- | } | ||
- | #endif | ||
</ | </ | ||
- | <TODO tip 80% center round> | + | <WRAP todo 80% center round> |
- | Στον παραπάνω κώδικα αντικαταστήστε την | + | Στον παραπάνω κώδικα αντικαταστήστε την |
+ | < | ||
+ | *** Error in `./ | ||
+ | ======= Backtrace: ========= | ||
+ | / | ||
+ | / | ||
+ | / | ||
</ | </ | ||
+ | </ | ||
+ | |||
+ | ===== Εξειδίκευση της κλάσης Box στην περίπτωση που η παράμετρος είναι δείκτης σε χαρακτήρα ===== | ||
Το παραπάνω παράδειγμα είναι ικανοποιητικό εάν περαστεί ως δείκτης ένα αντικείμενο τύπου **int* ** ή **Student* **, όμως δεν είναι ικανοποιητικό εάν περαστεί ένας δείκτης τύπου **char* ** που αντιπροσωπεύει ένα C string. Σε αυτή την περίπτωση δεν αρκεί να δεσμευθεί η μνήμη για ένα χαρακτήρα, | Το παραπάνω παράδειγμα είναι ικανοποιητικό εάν περαστεί ως δείκτης ένα αντικείμενο τύπου **int* ** ή **Student* **, όμως δεν είναι ικανοποιητικό εάν περαστεί ένας δείκτης τύπου **char* ** που αντιπροσωπεύει ένα C string. Σε αυτή την περίπτωση δεν αρκεί να δεσμευθεί η μνήμη για ένα χαρακτήρα, | ||
Line 160: | Line 123: | ||
#ifndef _BOXCHARPTR_HPP_ | #ifndef _BOXCHARPTR_HPP_ | ||
#define _BOXCHARPTR_HPP_ | #define _BOXCHARPTR_HPP_ | ||
+ | |||
+ | #include " | ||
+ | #include < | ||
+ | |||
template <> | template <> | ||
class Box<char *> { | class Box<char *> { | ||
Line 216: | Line 183: | ||
#endif | #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.1557830254.txt.gz · Last modified: 2019/05/14 09:37 (external edit)