Esercitazione del 21 febbraio 2008 Esercizio 1: Adattare la classe Vettore affinchè possa essere usata con la funzione di swap seguente scritta come template: template void swap(X &a, X &b){ X temp; temp = a; a = b; b = temp; } class Vettore{ Record *p; // sizeAttuale serve a contenere il riempimento attuale e al contempo indica // l'indice per il prossimo inserimento (una posizione // successiva all'ultimo elemento correntemente contenuto). // dimAttuale è invece la capacità attuale // incremento corrisponde alla quantità di locazioni di nel vettore che // verranno create quando si supera la capacità attuale // dimIniziale serve alla funzione membro clear; in caso di cancellazione // del contenuto con clear, il vettore viene reinizializzato // ad una capacità (dimAttuale) pari a dimIniziale int sizeAttuale, dimAttuale, incremento, dimIniziale; public: // Interfaccia pubblica del Vettore // Costruttori Vettore(); Vettore(int dimIniziale, int incremento); // Costruttore di copia: viene usato nei passaggi per copia di oggetti // di tipo Vettore Vettore(const Vettore &v); // Distruttore ~Vettore(); // Aggiunge in coda al vettore un nuovo oggetto (passaggio per copia) void add(Record c); // Preleva l'oggetto in posizione index dal vettore Record get(int index); // Fornisce il riempimento attuale del vettore int size(); // Stampa a video tutti gli oggetti contenuti void stampa(); // Con v3 = v1 + v2 si ottiene un nuovo vettore v3, ottenuto accondando // agli elementi di v1 gli elementi di v2 e ricopiandoli (con l'operatore // di assegnazione) in v3 Vettore operator+(Vettore v); Vettore operator=(Vettore v); // Azzera il contenuto del vettore, deallocando tutti gli oggetti // precedentemente contenuti e riportandolo alle dimensioni iniziali. void clear(); }; Esercizio 2: Aggiungere alle classi Record e Vettore seguenti, i metodi di inserimento per l'invio su ostream. class Vettore{ Record *p; // sizeAttuale serve a contenere il riempimento attuale e al contempo indica // l'indice per il prossimo inserimento (una posizione // successiva all'ultimo elemento correntemente contenuto). // dimAttuale è invece la capacità attuale // incremento corrisponde alla quantità di locazioni di nel vettore che // verranno create quando si supera la capacità attuale // dimIniziale serve alla funzione membro clear; in caso di cancellazione // del contenuto con clear, il vettore viene reinizializzato // ad una capacità (dimAttuale) pari a dimIniziale int sizeAttuale, dimAttuale, incremento, dimIniziale; public: // Interfaccia pubblica del Vettore // Costruttori Vettore(); Vettore(int dimIniziale, int incremento); // Costruttore di copia: viene usato nei passaggi per copia di oggetti // di tipo Vettore Vettore(const Vettore &v); // Distruttore ~Vettore(); // Aggiunge in coda al vettore un nuovo oggetto (passaggio per copia) void add(Record c); // Preleva l'oggetto in posizione index dal vettore Record get(int index); // Fornisce il riempimento attuale del vettore int size(); // Con v3 = v1 + v2 si ottiene un nuovo vettore v3, ottenuto accondando // agli elementi di v1 gli elementi di v2 e ricopiandoli (con l'operatore // di assegnazione) in v3 Vettore operator+(Vettore v); Vettore operator=(Vettore v); // Azzera il contenuto del vettore, deallocando tutti gli oggetti // precedentemente contenuti e riportandolo alle dimensioni iniziali. void clear(); }; class Record{ char nome[MAX_LEN]; char cognome[MAX_LEN]; public: Record(const char *, const char *); Record(); void setNome(const char *n); void setCognome(const char *c); }; Esercizio 3 Scrivere la classe Vettore come template, effettuando anche l'overloading dell'operatore di inserimento.