This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
cpp:function_templates [2019/05/04 04:23] gthanos [Templates συναρτήσεων με παραμέτρους σύνθετους τύπους (κλάσεις)] |
cpp:function_templates [2021/06/04 16:29] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Templates Συναρτήσεων ====== | ||
| - | |||
| - | Ας υποθέσουμε ότι θέλουμε να φτιάξουμε μία συνάρτηση η οποία να βρίσκει το μέγιστο μεταξύ δύο τιμών. Η συνάρτηση θα μπορούσε να είναι η εξής: | ||
| - | <code cpp> | ||
| - | int maximum(int a, int b) { return (a> | ||
| - | </ | ||
| - | |||
| - | Αντίστοιχα εάν θέλουμε να βρούμε το μέγιστο μεταξύ δύο αριθμών κινητής υποδιαστολής θα καλούμαστε να γράψουμε | ||
| - | <code cpp> | ||
| - | double maximum(double a, double b) { return (a> | ||
| - | </ | ||
| - | |||
| - | Το ερώτημα είναι εάν θα μπορούσαμε να αποφύγουμε τις παραπάνω δηλώσεις και αντ' | ||
| - | |||
| - | Η παραπάνω συνάρτηση θα μπορούσε να γραφεί με τη βοήθεια // | ||
| - | <code cpp> | ||
| - | template < | ||
| - | T maximum(T a, T b) { return (a> | ||
| - | </ | ||
| - | |||
| - | Το **Τ** μπορεί να είναι οποιοσδήποτε τύπος, επομένως και κάποιος τύπος που περιγράφεται από κλάση. Προκειμένου να μην γίνονται σημαντικές αντιγραφές κατά την κλήση των παραμέτρων με τιμή, προτιμούμε την παρακάτω ισοδύναμη, | ||
| - | <code cpp> | ||
| - | template < | ||
| - | T& maximum(T& | ||
| - | </ | ||
| - | |||
| - | Ας προσπαθήσουμε να χρησιμοποιήσουμε την παραπάνω συνάρτηση. | ||
| - | <code cpp maximum1.cpp> | ||
| - | template < | ||
| - | T& maximum(T& | ||
| - | |||
| - | #include < | ||
| - | using namespace std; | ||
| - | |||
| - | int main() { | ||
| - | int a = 5, b = 10; | ||
| - | double d = 5.5, f=3.3; | ||
| - | cout << " | ||
| - | cout << " | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | <WRAP tip 80% center round> | ||
| - | Μία // | ||
| - | </ | ||
| - | |||
| - | <WRAP tip 80% center round> | ||
| - | Μπορείτε να παραλείψετε τον τύπο των παραμέτρων κατά την κλήση της συνάρτησης **maximum** ως εξής: | ||
| - | <code cpp maximum1.cpp> | ||
| - | template < | ||
| - | T& maximum(T& | ||
| - | |||
| - | #include < | ||
| - | using namespace std; | ||
| - | |||
| - | int main() { | ||
| - | int a = 5, b = 10; | ||
| - | double d = 5.5, f=3.3; | ||
| - | cout << " | ||
| - | cout << " | ||
| - | } | ||
| - | </ | ||
| - | Ο λόγος είναι ότι ο // | ||
| - | </ | ||
| - | |||
| - | ===== Templates συναρτήσεων με παραμέτρους σύνθετους τύπους (κλάσεις) ===== | ||
| - | |||
| - | Ας υποθέσουμε ότι θέλουμε να κάνουμε χρήση της παραπάνω συνάρτηση **maximum** προκειμένου να βρούμε το μέγιστο μεταξύ δύο φοιτητών. Η κλάση του φοιτητή δίνεται παρακάτω: | ||
| - | |||
| - | <code cpp Student.hpp> | ||
| - | # | ||
| - | |||
| - | class Student { | ||
| - | char *name; | ||
| - | int aem; | ||
| - | | ||
| - | public: | ||
| - | Student(const char *name, int aem); | ||
| - | Student(); | ||
| - | Student(const Student& | ||
| - | Student(const Student* ); | ||
| - | ~Student(); | ||
| - | char *getName() const; | ||
| - | int getAEM() const; | ||
| - | void setName(const char *name); | ||
| - | void setAEM(int aem); | ||
| - | friend std:: | ||
| - | bool operator> | ||
| - | Student& | ||
| - | }; | ||
| - | |||
| - | Student:: | ||
| - | this-> | ||
| - | strcpy(this-> | ||
| - | this-> | ||
| - | } | ||
| - | |||
| - | Student:: | ||
| - | name = new char [strlen(st.name) + 1]; | ||
| - | strcpy(name, | ||
| - | aem = st.aem; | ||
| - | } | ||
| - | |||
| - | Student:: | ||
| - | name = new char [strlen(st-> | ||
| - | strcpy(name, | ||
| - | aem = st->aem; | ||
| - | } | ||
| - | |||
| - | Student:: | ||
| - | this-> | ||
| - | this-> | ||
| - | } | ||
| - | |||
| - | Student:: | ||
| - | if(name != nullptr) | ||
| - | delete []name; | ||
| - | } | ||
| - | |||
| - | char* Student:: | ||
| - | return name; | ||
| - | } | ||
| - | |||
| - | int Student:: | ||
| - | return aem; | ||
| - | } | ||
| - | |||
| - | void Student:: | ||
| - | if(this-> | ||
| - | delete this-> | ||
| - | this-> | ||
| - | strcpy(this-> | ||
| - | } | ||
| - | |||
| - | void Student:: | ||
| - | this-> | ||
| - | } | ||
| - | |||
| - | Student& | ||
| - | if(name != nullptr) | ||
| - | delete name; | ||
| - | name = new char [strlen(st.name) + 1]; | ||
| - | strcpy(name, | ||
| - | aem = st.aem; | ||
| - | return *this; | ||
| - | } | ||
| - | |||
| - | std:: | ||
| - | out << st.name << " " << st.aem; | ||
| - | return out; | ||
| - | } | ||
| - | |||
| - | bool Student:: | ||
| - | if(aem > st.aem) | ||
| - | return true; | ||
| - | return false; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | O κώδικας που κάνει χρήση της παραπάνω κλάσης είναι ο εξής: | ||
| - | |||
| - | <code cpp maximum2.cpp> | ||
| - | template < | ||
| - | T& maximum(T& | ||
| - | |||
| - | #include < | ||
| - | using namespace std; | ||
| - | |||
| - | #include " | ||
| - | |||
| - | int main() { | ||
| - | Student george(" | ||
| - | cout << " | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Εάν προσπαθήσουμε να μεταγλωττίσουμε, | ||
| - | |||
| - | <code cpp> | ||
| - | // σύγκριση δύο μαθητών με βάση το ΑΕΜ τους | ||
| - | bool Student:: | ||
| - | if(aem < st.aem) | ||
| - | return true; | ||
| - | return false; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Εφόσον προσθέσουμε την παραπάνω συνάρτηση υπεφόρτωσης του τελεστή **< | ||
| - | < | ||
| - | max(' | ||
| - | </ | ||
| - | |||
| - | ===== Templates συναρτήσεων με αριθμητικές παραμέτρους ===== | ||
| - | |||
| - | Ας υποθέσουμε τώρα ότι θέλουμε να βρούμε το μέγιστο μεταξύ περισσότερων των δύο αριθμητικών τιμών οι οποίες έχουν αποθηκευτεί σε ένα πίνακα. Σε αυτή την περίπτωση η συνάρτηση **maximum** θα μπορούσε να γραφεί ως εξής: | ||
| - | |||
| - | <code cpp> | ||
| - | template < | ||
| - | T& maximum(T a[]) { | ||
| - | T& max = a[0]; | ||
| - | for(int i=1; i<size; i++) | ||
| - | if(a[i]> | ||
| - | max = a[i]; | ||
| - | return max; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Παρατηρήστε ότι η συνάρτηση λαμβάνει μία επιπλέον ακέραια τιμή ως παράμετρο που αντιπροσωπεύει το μέγεθος του πίνακα. | ||
| - | |||
| - | Ο κώδικας χρήσης της παραπάνω συνάρτησης θα μπορούσε να είναι ο εξής: | ||
| - | <code cpp maximum3.cpp> | ||
| - | #include < | ||
| - | using namespace std; | ||
| - | |||
| - | template < | ||
| - | T& maximum(T a[]) { | ||
| - | T& max = a[0]; | ||
| - | for(int i=1; i<size; i++) | ||
| - | if(a[i]> | ||
| - | max = a[i]; | ||
| - | return max; | ||
| - | } | ||
| - | |||
| - | #include " | ||
| - | |||
| - | int main() { | ||
| - | Student george(" | ||
| - | Student students[] = { george, kate, mary }; | ||
| - | cout << " | ||
| - | } | ||
| - | </ | ||
| - | |||