ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ
[email protected]Διδάσκων: Νίκος Παπασπύρου
http://www.softlab.ntua.gr/~nickie/TUC/log201/
1Νίκος Παπασπύρου ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ
Διαφάνειες παρουσίασης #7
Templates συναρτήσεωνTemplates κλάσεωνTemplates και κληρονομικότηταTemplates και φίλες συναρτήσειςΧειρισμός εξαιρέσεων
2Νίκος Παπασπύρου ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ
Templates συναρτήσεων(i)
Ανάγκη αποφυγής περιττού κώδικα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)
Ορισμός template συνάρτησηςtemplate <class T>T min (T t1, T t2){ return (t1 < t2) ? t1 : t2;}
Ερμηνεία Για κάθε τύπο T ορίζεται μια συνάρτησηT min (T t1, T t2)
Ο ορισμός της συνάρτησης γίνεται όταν αυτή χρησιμοποιηθεί για πρώτη φορά (instantiation)
4Νίκος Παπασπύρου ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ
Templates συναρτήσεων(iii)
Υπερφόρτωση templatetemplate <class T>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)
Εξειδίκευση templatetemplate <class T>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)
Ανάγκη αποφυγής περιττού κώδικα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)
Ορισμός template κλάσηςtemplate <class T>class Pair{ // definition}
Ερμηνεία Για κάθε τύπο T ορίζεται μια κλάσηPair<T>
Ο ορισμός της κλάσης γίνεται όταν αυτή χρησιμοποιηθεί για πρώτη φορά (instantiation)
8Νίκος Παπασπύρου ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ
Templates κλάσεων(iii)
Παράδειγμα: ζεύγη ομοίωνtemplate <class T>class Pair{private: T eFirst, eSecond;
public: Pair (const T & a, const T & b);
T fst () const; T snd () const;};
9Νίκος Παπασπύρου ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ
Templates κλάσεων(iv)
Παράδειγμα (συνέχεια)template <class T>Pair<T>::Pair (const T & a, const T & b) : eFirst(a), eSecond(b){ /* nothing */ }
template <class T>T Pair<T>::fst () const{ return eFirst; }
template <class T>T Pair<T>::snd () const{ return eSecond; }
10Νίκος Παπασπύρου ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ
Templates κλάσεων(v)
Παράδειγμα: ζεύγη ανομοίωνtemplate <class T1, class T2>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)
Παράδειγμα (συνέχεια)template <class T1, class T2>Pair<T1, T2>::Pair (const T1 & a, const T2 & b) : eFirst(a), eSecond(b){ /* nothing */ }
template <class T1, class T2>T1 Pair<T1, T2>::fst () const{ return eFirst; }
template <class T1, class T2>T2 Pair<T1, T2>::snd () const{ return eSecond; }
12Νίκος Παπασπύρου ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ
Templates και κληρονομικότητα (i)
Παράδειγμα: τριάδες ανομοίωνtemplate <class T1, class T2, class T3>class Triple : public Pair< T1, Pair<T2, T3> >{public: Triple (const T1 & a, const T2 & b, const T3 & c);
T2 snd () const; // hides old snd T3 trd () const;};
13Νίκος Παπασπύρου ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ
Templates και κληρονομικότητα (ii)
Παράδειγμα (συνέχεια)template <class T1, class T2, class T3>Triple<T1, T2, T3>::Triple ( const T1 & a, const T2 & b, const T3 & c) : Pair< T1, Pair<T2, T3> >( a, Pair<T2, T3>(b, c)){ // nothing}
14Νίκος Παπασπύρου ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ
Templates και κληρονομικότητα (iii)
Παράδειγμα (συνέχεια)template <class T1, class T2, class T3>T2 Triple<T1, T2, T3>::snd () const{ return eSecond.fst();}
template <class T1, class T2, class T3>T3 Triple<T1, T2, T3>::trd () const{ return eSecond.snd();}
15Νίκος Παπασπύρου ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ
Templates και κληρονομικότητα (iv)
Παράδειγμα (κύριο πρόγραμμα)Pair<int, double> p(42, 1.7);
cout << p.fst() << ", " << p.snd() << ".\n";
Triple<int, double, const char *> t(42, 1.7, "hello");
cout << t.fst() << ", " << t.snd() << ", " << t.trd() << ".\n";
16Νίκος Παπασπύρου ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ
Templates και φίλες συναρτήσεις (i)
Παράδειγμαtemplate <class T1, class T2>class Pair{ // ... friend Pair<T1, T2> operator + <T1, T2> ( const Pair<T1, T2> & p1, const Pair<T1, T2> & p2);};
17Νίκος Παπασπύρου ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ
Templates και φίλες συναρτήσεις (ii)
Παράδειγμαtemplate <class T1, class T2>Pair<T1, T2> operator + ( const Pair<T1, T2> & p1, const Pair<T1, T2> & p2){ return Pair<T1, T2>( p1.eFirst + p2.eFirst, p1.eSecond + p2.eSecond);}
18Νίκος Παπασπύρου ΛΟΓ201: Τεχνολογία Λογισμικού ΙΙ
Χειρισμός εξαιρέσεων (i)
Τί είναι εξαιρέσεις Κάθε είδους ανωμαλίες ή σφάλματα που
προκύπτουν κατά την εκτέλεση του προγράμματος και πρέπει να ξεπερασθούνμε ειδικό τρόπο
Π.χ. διαίρεση με το μηδέν, εξάντληση μνήμης
Χειρισμός εξαιρέσεων στη C++ Μηχανισμός: 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)
Παράδειγμα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)
Παράδειγμα (συνέχεια)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";}