La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Tipi parametrici Collezioni generiche. Strutture matematiche parametriche.

Presentazioni simili


Presentazione sul tema: "Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Tipi parametrici Collezioni generiche. Strutture matematiche parametriche."— Transcript della presentazione:

1 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Tipi parametrici Collezioni generiche. Strutture matematiche parametriche

2 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Funzioni parametriche sul tipo: modelli Vi sono algoritmi che non dipendono dal tipo dei dati che elaborano: void swap (int& m, int& n) {int temp = m; m = n; n = temp; } void swap (string& s, string& t) {string temp = s; s = t; n = temp; } In C++ possiamo parametrizzare sul tipo degli argomenti: template void swap (T& m, T& n) { T temp = m; m = n; n = temp; } modello

3 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Chiamata di modelli di funzioni Quando occorre chiamare una funzione parametrizzata sul tipo, il C++ consente di lasciare quest’ultimo implicito, deducendolo dal contesto di chiamata: int m = 6; n = 34; swap(n, m); string(s1 = “Mario Rossi”, s2 = “Giovanni Bianchi”); swap(s1, s2); Nota: la dichiarazione significa “per ogni tipo T ” (non necessariamente una classe (es. T = int ); inoltre è possibile parametrizzare su più di un tipo: template

4 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Overloading di operatori Come per le funzioni, anche gli operatori possono essere sovraccaricati in C++: class Complex { public: Comlex(float re=0, float im=0) {real = re; imag = im;} Complex operator+(const Complex&); private: float real, imag; }; Complex Complex::operator+(const Complez& z) { return Complex(real + z.real; imag + z.imag);} //... Complex A = C + B; // equivale a C.operator+(B)

5 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Strutture dati parametriche La maggior parte delle strutture dati non elementari è parametrica nel tipo dei dati contenuti: vettori, liste, pile, code, alberi, ecc. Sintassi C++: template class X {... } Come accade per i modelli di funzioni, quelli delle classi generano classi per istanziazione del parametro con un tipo: X x; // x ha classe ottenuta da X // quando T = short X y; // y ha classe ottenuta da X // quando T = string

6 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Metodi delle strutture parametriche I metodi di una classe parametrica sono in effetti dei modelli: template class X { T square (T x) {return x*x; } }; viene trattato come template T square (T x) {return x*x; } Dunque il modello X genera la classe X equivalente a: class Xshort { short square (short x) {return x*x; } };

7 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Classe Stack parametrica template class Stack { public: Stack (int s = 100) { size = s; top = -1; data = new T[size]; } ~Stack {delete [] data;} void push (T x) {data[++top] = x;} T pop () {return data[top--];} bool isEmpty () {return top == -1;} bool isFull () {return top == size-1;} private: int size, top; T* data; };

8 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Elementi della lista: subtyping class ListEl; typedef ListEl *PListEl; class ListEl { friend class List; friend class ListIterator; private: Object info; PListEl next; ListEl (Object obj, PListEl nxt) { info = obj; next = nxt;} };

9 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Liste parametriche template class ListEl { friend class List ; friend class LisIterator ; private: T info; ListEl * next; ListEl (T x, ListEl * n) { info = x; next = n;} };

10 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Liste: subtyping class ListEl; typedef ListEl *PListEl; class List : public Collection { friend class ListIterator; public: void insert (PObject obj); // inserimento in testa void insert (int index, PObject obj); // overloading: inserimento con indice bool empty (void) { return first == NULL;} PIterator iterator (void); //... protected: PListEl first; };

11 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Liste parametriche template class List { friend class LisIterator ; public: void insert (T x); // inserimento in testa void insert (int index, T x); // overloading: inserimento con indice bool empty (void) { return first == NULL;} ListIterator * iterator (void); //... protected: ListEl * first; };

12 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Iteratori sulle liste: subtyping class ListIterator; typedef ListIterator *PListIterator; class ListIterator : public Iterator { public: bool hasNext (void); Object next (void); void reinit() {current = mylist->first;} ListIterator (PList l) { mylist = l; current = l->first;} private: PList mylist; PListEl current; };

13 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Iteratori su liste parametriche template class ListIterator { public: bool hasNext (void); T next (void); void reinit() {current = mylist->first;} ListIterator (const List l) { mylist = l; current = l->first;} private: const List * mylist; ListEl * current; };


Scaricare ppt "Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Tipi parametrici Collezioni generiche. Strutture matematiche parametriche."

Presentazioni simili


Annunci Google