1 laboratorio di calcolo II AA 2003/04 ottava settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( ) UNIVERSITA DEGLI STUDI ROMA TRE DIPARTIMENTO DI FISICA E. AMALDI
2 Relazioni tra Concetti ed Ereditarietà «A concept does not exist in isolation. It coexists with related concepts and derives much of its power from relationships with related concepts…» (B. Stroustrup) Indipendenza tra Concetti e Programmazione Generica «Independent concepts should be independently represented and should be combined only when needed. Where this principle is violated, you either bundle unrelated concepts together or create unnecessary dependencies. Either way, you get a less flexible set of components out of which to compose systems…» (B. Stroustrup) Relazioni tra concetti Ereditarieta Concetti Indipendenti Templates premessa
3 Limplementazione di un metodo assume molte forme ( poli- morfismo ) ed e possibile scegliere automaticamente la forma giusta Polimorfismo a Run Time La forma giusta viene scelta durante lesecuzione del programma Polimorfismo a Compilation Time La forma giusta viene scelta durante la compilazione del programma Programmazione Generica
4 Voglio contare le gocce di pioggia che cadono sulle mattonelle di un pavimento class Myfloor { protected : int element[4][4] ; public: // costruttori // distruttore // metodi di tipo set // metodi di tipo get // altri metodi (incremento) // operatori ………………………………….. } ; Esempio 1
5 Voglio studiare la distribuzione di massa in una lastra non omogenea class Myplate { protected : double element[4][4] ; public: // costruttori // distruttore // metodi di tipo set // metodi di tipo get // altri metodi (incremento) // operatori ………………………………….. } ; Esempio 2
6 Voglio studiare il capo elettrico su un reticolo class Myfield { protected : ThreeVector element[4][4] ; public: // costruttori // distruttore // metodi di tipo set // metodi di tipo get // altri metodi (incremento) // operatori ………………………………….. } ; Esempio 3
7 Stiamo scrivendo molte linee di codice praticamente identiche, ma non possiamo ri-utilizzare il codice attraverso il meccanismo dellEreditarietà, infatti da un lato non ci sono relazioni sfruttabili tra le situazioni elencate e dallaltro attributi e metodi delle classi che abbiamo visto sono di tipo diverso. Il problema Ma la possibilità di ri-utilizzare del codice non era uno dei cardini della programmazione OO?
8 Lezione 1: Requisiti per il software moderno 1.Robustezza protezioni nellaccesso ai dati 2.Possibilità di ri-utilizzo del codice 1.economia di risorse umane ed economiche 2.maggiore affidabilità 3.Portabilità 1.verso sistemi operativi diversi 2.verso diverse versioni di uno stesso sistema 4.Flessibilità e Organizzazione del Codice semplicità di gestione e sviluppo successivo del codice
9 Vogliamo calcolare il minimo tra due oggetti (per i quali sia definito un ordinamento). Definiamo una funzione minimo per ogni tipo di oggetto trattato: double & minimo(const double & a1, const double & a2) { if(a1<=a2) { return a1; } else { return a2;} } TwoVect & minimo(const TwoVect & a1, const TwoVect & a2) { if(a1<=a2) { return a1; } else { return a2} ; } int & minimo(const int & a1, const int & a2) { if(a1<=a2) { return a1; } else { return a2;} } Esempio 4
10 Introduco un parametro T che rappresenta il tipo (la classe) cui appartengono gli oggetti da trattare e implemento il codice in funzione della generica classe T. Specificando T (int, double, complex, TwoVector…) in fase di compilazione ottengo il codice oggetto che tratta interi, reali in doppia precisione, complessi, vettori a due componenti… La soluzione: le classi Template
11 La sintassi delle classi Template template class Myclass { ………………………………… // T si puo usare come // una classe qualsiasi …………………………………. }; Dichiarazione (.h): template tipo Myclass ::nomemetodo(…) { …………… } Implementazione (.icc): Implementazione (.cc): export template tipo Myclass ::nomemetodo(…) { …………… }
12 Esempi 1,2 e 3 template class Mynet { protected : T element[4][4] ; public: // costruttori // distruttore // metodi di tipo set // metodi di tipo get // altri metodi (incremento) // operatori ………………………………….. } ; MyfloorMynet MyplateMynet MyfieldMynet
13 #include Mynet.h int main() { ……………… Mynet mi; Mynet mdb; Mynet mtv; ……………… return 0; } Uso di una classe Template
14 class Myfloor : public Mynet { public: // costruttori ~Myfloor() {}; // distruttore } ; posso poi usare anche lEreditarietà, implementando solo costruttori e distruttori class Myplate : public Mynet { public: // costruttori ~Myplate() {}; // distruttore } ; #include class Myfield : public Mynet { public: // costruttori ~Myplate() {}; // distruttore } ; Template e ereditarietà #include Mynet.h int main() { ……………… Myfloor mi; Myplate mdb; Myfield mtv; ……………… return 0; }
15 template T & minimo(const T & a1, const T & a2) { if(a1<=a2) { return a1; } else { return a2;} } La funzione: E il suo uso: #include int main() { float a = min(3.,2.); //float int i = min(2,3); // int TwoVector p1(1.,2.); TwoVector p2(3.,1.); TwoVector p3 = min(p1,p2); return 0; } #include mymin.icc Esempio 4
16 1.Riferimenti Libreria STL
17 Strutture dati per memorizzare oggetti (e puntatori ad oggetti) Esempi di contenitori vector list map Per accedere ad essi (iteratori) Per eseguire operazioni su di essi ( find, sort, copy, merge… ) container
18 push_back() begin() end() end() p pp p p 0 p ++ Funzionamento di vector
19 #include int main() { vector v; // create an empty vector of integers cout << v.size() << endl; // print the size of v: zero for (int I=0; I!=10; ++I) { // a loop from 0 to 9 v.push_back(I); // add an integer to v from the back } cout << v.size() << endl; // print the size of v: 10 // create an constant iterator for a vector of integers: // p behaves at all effects as a const int * vector ::const_iterator p; // begin() points to the first element // and end() to the last+1 // (compare with the previous for loop) for (p=v.begin(); p!=v.end(); ++p) cout << (*p) << ; cout << endl; return 0; } Main.cc Uso di vector