Οντοκεντρικόσ Προγραμματιςμόσ Ενότθτα 7: C++ TEMPLATES, ΤΠΕΡΦΟΡΣΩΗ ΣΕΛΕΣΩΝ, ΕΞΑΙΡΕΕΙ Templates Ιωάννθσ Χατηθλυγεροφδθσ Πολυτεχνικι χολι Σμιμα Μθχανικών Η/Τ & Πλθροφορικισ
Templates
Ειςαγωγι Templates o Templates υναρτιςεων Οριςμόσ μιασ ςειράσ ςχετιηόμενων ςυναρτιςεων (με υπερφόρτωςθ) o Templates Σάξεων Οριςμόσ μιασ ςειράσ ςχετικών κλάςεων 3/16
Function Templates Τπερφορτωμζνεσ υναρτιςεισ (Overloaded) o Παρόμοιεσ λειτουργίεσ Διαφορετικόσ τφποσ δεδομζνων Πρότυπεσ υναρτιςεισ (templates) o Ίδια ακριβώσ λειτουργία Διαφορετικόσ τφποσ δεδομζνων o Διλωςθ μιασ μόνο ςυνάρτθςθσ template O compiler παράγει ξεχωριςτζσ ςυναρτιςεισ o Type checking 4/16
Function Templates Οριςμόσ Function template o Οριςμόσ με τθν λζξθ κλειδί template o Ο τφποσ των παραμζτρων δθλώνεται μζςα ςε brackets < > Πριν από κάκε παράμετρο μπαίνει το: class ι typename (ιςοδφναμα) template< class T > template< typename ElementType > template< class BorderType, class FillType > Μποροφμε να κακορίςουμε τον τφπο ςε: Ορίςματα ςυνάρτθςθσ Σφποσ επιςτρεφόμενθσ τιμισ Σοπικζσ Μεταβλθτζσ μζςα ςτο ςώμα τθσ ςυνάρτθςθσ 5/16
Παράδειγμα #include iostream using namespace std; template <class T> class mypair { T a, b; public: mypair (T first, T second){ a=first; b=second; T getmax (); ; Η κλάςθ mypair περιζχει δφο όμοιεσ μεταβλθτζσ. Ο τφποσ των μεταβλθτών κα κακορίηεται κάκε φορά κατά τθν δθμιουργία ενόσ αντικειμζνου. template <class T> T mypair<t>::getmax () { T retval; retval = a>b? a : b; return retval; int main () { mypair <int> integerpair (100, 75); cout << integerpair.getmax(); mypair <char> charpair ('g', 'c'); cout << charpair.getmax(); return 0; Ο τφποσ μπορεί να είναι build in όπωσ ςτο παράδειγμα (int, char) αλλά και οποιαςδιποτε κλάςθσ. ΠΧ: Dog dog1("max") Dog dog2("wolfy"); mypair <Dog> charpair (dog1, dog2); Προςοχι: ςτο ςυγκεκριμζνο παράδειγμα κα πρζπει ςτθν κλάςθ Dog να ζχουμε κάνει υπερφόρτωςθ του τελεςτι ςφγκριςθσ > 6/16
Υλοποίθςθ Στοίβασ με Template Κλάςθ template< class T > class Stack { public: Stack( int = 10 ); ~Stack() { delete [] stackptr; bool push( const T& ); bool pop( T& ); bool isempty() const { return top == -1; bool isfull() const { return (top == size - 1); private: int size; int top; T *stackptr; ; template< class T > Stack< T >::Stack( int s ){ size = s > 0? s : 10; top = -1; stackptr = new T[ size ]; template< class T > bool Stack< T >::push( const T &pushvalue ){ if (!isfull() ) { stackptr[ ++top ] = pushvalue; return true; return false; template< class T > bool Stack< T >::pop( T &popvalue ){ if (!isempty() ) { popvalue = stackptr[ top-- ]; return true; return false; 7/16
Templates και static μζλθ Απλι κλάςθ (όχι template class) o Σα static μζλθ μοιράηονται από όλα τα αντικείμενα Class-template o Κάκε τφποσ ζχει δικά του αντίγραφα των static μεταβλθτών o static μεταβλθτζσ αρχικοποιοφνται ςε εμβζλεια αρχείου o Κάκε τφποσ ζχει δικά του αντίγραφα των static μεκόδων 8/16
Πρόςκετο Υλικό Μελετιςτε και τα παραδείγματα από τα Κεφάλαια 18 του βιβλίου: «C++ How to Program, 9/e Paul & Harvey Deitel» http://media.pearsoncmg.com/ph/esm/deitel/cpp_htp_9/code_examples/code_examples.zip 9/16
Χρθματοδότθςθ Σο παρόν εκπαιδευτικό υλικό ζχει αναπτυχκεί ςτo πλαίςιo του εκπαιδευτικοφ ζργου του διδάςκοντα. Σο ζργο «Ανοικτά Ακαδθμαϊκά Μακιματα ςτο Πανεπιςτιμιο Ακθνών» ζχει χρθματοδοτιςει μόνο τθν αναδιαμόρφωςθ του εκπαιδευτικοφ υλικοφ. Σο ζργο υλοποιείται ςτο πλαίςιο του Επιχειρθςιακοφ Προγράμματοσ «Εκπαίδευςθ και Δια Βίου Μάκθςθ» και ςυγχρθματοδοτείται από τθν Ευρωπαϊκι Ζνωςθ (Ευρωπαϊκό Κοινωνικό Σαμείο) και από εκνικοφσ πόρουσ. 10/16
θμείωμα Ιςτορικοφ Εκδόςεων Ζργου Σο παρόν ζργο αποτελεί τθν ζκδοςθ 1.0. 11/16
θμείωμα Αναφοράσ Copyright: Πανεπιςτιμιον Πατρών, Ιωάννθσ Χατηθλυγεροφδθσ, 2015. «Οντοκεντρικόσ Προγραμματιςμόσ». Ζκδοςθ: 1.0. Πάτρα 2015. Διακζςιμο από τθ δικτυακι διεφκυνςθ: https://eclass.upatras.gr/courses/ceid1105/ 12/16
θμείωμα Αδειοδότθςθσ Σο παρόν υλικό διατίκεται με τουσ όρουσ τθσ άδειασ χριςθσ Creative Commons Αναφορά, Μθ Εμπορικι Χριςθ Παρόμοια Διανομι 4.0 *1+ ι μεταγενζςτερθ, Διεκνισ Ζκδοςθ. Εξαιροφνται τα αυτοτελι ζργα τρίτων π.χ. φωτογραφίεσ, διαγράμματα κ.λ.π., τα οποία εμπεριζχονται ςε αυτό και τα οποία αναφζρονται μαηί με τουσ όρουσ χριςθσ τουσ ςτο «θμείωμα Χριςθσ Ζργων Σρίτων». [1] http://creativecommons.org/licenses/by-nc-sa/4.0/ Ωσ Μθ Εμπορικι ορίηεται θ χριςθ: που δεν περιλαμβάνει άμεςο ι ζμμεςο οικονομικό όφελοσ από τθν χριςθ του ζργου, για το διανομζα του ζργου και αδειοδόχο που δεν περιλαμβάνει οικονομικι ςυναλλαγι ωσ προχπόκεςθ για τθ χριςθ ι πρόςβαςθ ςτο ζργο που δεν προςπορίηει ςτο διανομζα του ζργου και αδειοδόχο ζμμεςο οικονομικό όφελοσ (π.χ. διαφθμίςεισ) από τθν προβολι του ζργου ςε διαδικτυακό τόπο Ο δικαιοφχοσ μπορεί να παρζχει ςτον αδειοδόχο ξεχωριςτι άδεια να χρθςιμοποιεί το ζργο για εμπορικι χριςθ, εφόςον αυτό του ηθτθκεί.
Διατιρθςθ θμειωμάτων Οποιαδιποτε αναπαραγωγι ι διαςκευι του υλικοφ κα πρζπει να ςυμπεριλαμβάνει: το θμείωμα Αναφοράσ το θμείωμα Αδειοδότθςθσ τθ διλωςθ Διατιρθςθσ θμειωμάτων το θμείωμα Χριςθσ Ζργων Σρίτων (εφόςον υπάρχει) μαηί με τουσ ςυνοδευόμενουσ υπερςυνδζςμουσ. 14/16
θμείωμα Χριςθσ Ζργων Σρίτων Οι διαφάνειεσ βαςίηονται ςτο βιβλίο «C++ How to Program, 8th Edition, Harvey M. Deitel, Paul J. Deitel, Prentice Hall.» 15/16