ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Διδάσκων: Νίκος Παπασπύρου 1Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Διαφάνειες παρουσίασης #7 4 Templates συναρτήσεων 4 Templates κλάσεων 4 Templates και κληρονομικότητα 4 Templates και φίλες συναρτήσεις 4 Χειρισμός εξαιρέσεων
2Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates συναρτήσεων(i) u Ανάγκη αποφυγής περιττού κώδικα int i1 = 3, i2 = 5; int i = min(i1, i2); int min (int i1, int i2) { return (i1 < i2) ? i1 : i2; } double d1 = 1.4, d2 = 3.6; double d = min(d1, d2); Name n1("Antonius"), n2("Cleopatra"); Name n = min(n1, n2);
3Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates συναρτήσεων(ii) u Ορισμός template συνάρτησης template T min (T t1, T t2) { return (t1 < t2) ? t1 : t2; } u Ερμηνεία l Για κάθε τύπο T ορίζεται μια συνάρτηση T min (T t1, T t2) l Ο ορισμός της συνάρτησης γίνεται όταν αυτή χρησιμοποιηθεί για πρώτη φορά (instantiation)
4Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates συναρτήσεων(iii) u Υπερφόρτωση template template T min (int size, const T array[]) { T result = array[0]; for (int i=1; i<size; i++) if (array[i] < result) result = array[i]; return result; }
5Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates συναρτήσεων(iv) u Εξειδίκευση template template T min (T t1, T t2) { return (t1 < t2) ? t1 : t2; } char * min (char * s1, char * s2) { return (strcmp(s1, s2) < 0) ? s1 : s2; }
6Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates κλάσεων(i) u Ανάγκη αποφυγής περιττού κώδικα PairOfInt si(1, 5); cout << si.fst() << "\n"; PairOfDouble sd(3.5, -2.9); cout << sd.fst() << "\n"; PairOfName sn( Name("Antony"), Name("Cleopatra") ); cout << sn.fst() << "\n";
7Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates κλάσεων(ii) u Ορισμός template κλάσης template class Pair { // definition } u Ερμηνεία l Για κάθε τύπο T ορίζεται μια κλάση Pair l Ο ορισμός της κλάσης γίνεται όταν αυτή χρησιμοποιηθεί για πρώτη φορά (instantiation)
8Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates κλάσεων(iii) u Παράδειγμα: ζεύγη ομοίων template class Pair { private: T eFirst, eSecond; public: Pair (const T & a, const T & b); T fst () const; T snd () const; };
9Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates κλάσεων(iv) u Παράδειγμα (συνέχεια) template Pair ::Pair (const T & a, const T & b) : eFirst(a), eSecond(b) { /* nothing */ } template T Pair ::fst () const { return eFirst; } template T Pair ::snd () const { return eSecond; }
10Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates κλάσεων(v) u Παράδειγμα: ζεύγη ανομοίων template class Pair { private: T1 eFirst; T2 eSecond; public: Pair (const T1 & a, const T2 & b); T1 fst () const; T2 snd () const; };
11Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates κλάσεων(vi) u Παράδειγμα (συνέχεια) template Pair ::Pair (const T1 & a, const T2 & b) : eFirst(a), eSecond(b) { /* nothing */ } template T1 Pair ::fst () const { return eFirst; } template T2 Pair ::snd () const { return eSecond; }
12Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates και κληρονομικότητα(i) u Παράδειγμα: τριάδες ανομοίων template class Triple : public Pair > { public: Triple (const T1 & a, const T2 & b, const T3 & c); T2 snd () const; // hides old snd T3 trd () const; };
13Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates και κληρονομικότητα(ii) u Παράδειγμα (συνέχεια) template Triple ::Triple ( const T1 & a, const T2 & b, const T3 & c) : Pair >( a, Pair (b, c)) { // nothing }
14Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates και κληρονομικότητα(iii) u Παράδειγμα (συνέχεια) template T2 Triple ::snd () const { return eSecond.fst(); } template T3 Triple ::trd () const { return eSecond.snd(); }
15Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates και κληρονομικότητα(iv) u Παράδειγμα (κύριο πρόγραμμα) Pair p(42, 1.7); cout << p.fst() << ", " << p.snd() << ".\n"; Triple t(42, 1.7, "hello"); cout << t.fst() << ", " << t.snd() << ", " << t.trd() << ".\n";
16Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates και φίλες συναρτήσεις(i) u Παράδειγμα template class Pair { //... friend Pair operator + ( const Pair & p1, const Pair & p2); };
17Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Templates και φίλες συναρτήσεις(ii) u Παράδειγμα template Pair operator + ( const Pair & p1, const Pair & p2) { return Pair ( p1.eFirst + p2.eFirst, p1.eSecond + p2.eSecond); }
18Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Χειρισμός εξαιρέσεων(i) u Τί είναι εξαιρέσεις l Κάθε είδους ανωμαλίες ή σφάλματα που προκύπτουν κατά την εκτέλεση του προγράμματος και πρέπει να ξεπερασθούν με ειδικό τρόπο l Π.χ. διαίρεση με το μηδέν, εξάντληση μνήμης u Χειρισμός εξαιρέσεων στη C++ l Μηχανισμός: try - throw - catch
19Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ try { } Χειρισμός εξαιρέσεων(ii)... f ()... // something catch (Exc e) { // do something } void f () throw(Exc) {... if (wrong) { Exc e(...); throw e; }... } class Exc {... };
20Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Χειρισμός εξαιρέσεων(iii) u Παράδειγμα int min (int size, const int array[]) throw (const char *) { if (size <= 0) throw "ERROR: size <= 0"; if (array == NULL) throw "ERROR: array == NULL"; int result = array[0]; for (int i=1; i < size; i++) if (array[i] < result) result = array[i]; return result; }
21Νίκος ΠαπασπύρουΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ Χειρισμός εξαιρέσεων(iv) u Παράδειγμα (συνέχεια) int a [] = {42, 34, 5, 99, 37, 2, 21}; try { cout << "min(7, a) = " << min(7, a) << "\n"; cout << "min(4, a) = " << min(4, a) << "\n"; cout << "min(0, a) = " << min(0, a) << "\n"; // !!! } catch (const char * msg) { cout << "\nCaught exception:\n" << msg << "\n"; }