L'esercitazione vuole aiutarvi ad acquisire una maggiore
consapevolezza delle potenzialita' del meccanismo
dell'Ereditarieta' e del Polimorfismo. Inoltre dovrete mostrare
la capacita' di realizzare in C++ uno schema di classi come
quello proposto nel testo dell'esercitazione.
L'esercitazione vi offrira' inoltre l'opportunita' di applicare
le tecniche di passaggio degli argomenti di un metodo "per
referenza" e "per valore" e di comprendere meglio le differenze
tra le due modalita'.
Infine potrete
costruire un algoritmo di ordinamento sugli oggetti di una
classe, in modo da apprendere anche tecniche numeriche
sostanzialmente indipendenti dal linguaggio di programmazione,
anche se in questo caso scritte in C/C++.
Definire ed
Implementate una serie di classi legate tra loro da
una relazione di Ereditarieta’: scegliete la classe Shape delle figure
geometriche piane e fate ereditare da essa la classe Cerchio, la classe EsagonoR, Rettangolo, e da
quest'ultima la classe Quadrato.
Implementate i metodi Area(), Perimetro(), Tipo(), stampaTipo()
ecc. Altre scelte analoghe sono naturalmente
possibili. Rendete virtuali i metodi che lo richiedono
ed operate con economia e semplicita'. L'esercitazione
richiede quindi che traduciate in C++ lo schema
seguente:
In
particolare, implementate la seguente struttura per la
classe Shape:
I metodi delle altre classi saranno implementati in
base ai metodi della classe Shape. Ogni altra classe dovra'
avere il costruttore vuoto, il costruttore con parametri ed il
distruttore.
I metodi diff_A e mag_A della
classe Shape restituiscono un valore vero se la Shape a cui
vengono applicati ha rispettivamente un'area diversa o
maggiore della Shape che e' argomento del metodo.
Nella
realizzazione del programma main dovrete seguire i seguenti
punti:
Creazione di oggetti, vettori di oggetti e vettori di puntatori ad oggetti
Create una serie di oggetti ed applicate ad essi i vari metodi. Successivamente create un vettore di oggetti e ripetete le stesse operazioni. Verificate che solo utilizzando un vettore di puntatori potete mettere nello stesso vettore oggetti che ereditano dalla stessa classe o oggetti di classi legati tra loro da una relazione di ereditarieta’.
Funzionamento dei costruttori e distruttori
Verificare, attraverso i costruttori ed i distruttori intelligenti, come funziona il meccanismo di creazione e di distruzione per classi legate tra loro da una relazione di ereditarieta’, sia nel caso di oggetti ai quali si accede direttamente, sia nel caso di oggetti ai quali si accede con puntatori della classe stessa o con puntatori alla classe da cui l’oggetto eredita.
Uso di metodi virtuali
Utilizzando l’accesso agli oggetti attraverso i puntatori o mediante gli oggetti stessi, verificate il funzionamento del polimorfismo. Verificate quali risultati si ottengono definendo o non definendo alcuni metodi virtual. Verificate che solo definendo opportunamente alcuni metodi come virtual e’ possibile accedere correttamente ad essi attraverso un vettore di puntatori.
Distruttori virtuali
Uso di classi astratte
Rendete la classe “piu’ in alto” nella catena ereditarieta’ una classe astratta, definendo almeno un metodo come pure virtual. Verificate che in questo caso
i) Tutte le classi che erditano devono fornire l’implementazione del metodo pure virtual
ii) Non e’ possibile istanziare un oggetto della classe astratta
Il C/C++ permette di
scrivere singole componenti del programma in maniera semplice e di
ottenere il programma finale, anche molto complesso, accostando
tra loro in maniera opportuna le varie parti. Inoltre le classi
sono tra loro molto simili, per cui una volta scritta una classe,
sara' molto semplice copiare i file .h e .cc ed apportare ad
essi le necessarie modifiche.
Scrivete poche righe di codice per volta e compilate, cercando di
comprendere a fondo cio' che fate.
Potete pensare l'esercitazione divisa in quattro parti:
Parte 1: la scrittura
delle classi
Parte 2: la scrittura
del main()
di test, come descritto in precedenza (esercit_7.cpp)
Parte 3: lo sviluppo e il test di un
algoritmo che permetta di ordinare una vettore di Shape* in base
all'area, in ambiente C++
Parte 4:
l'implementazione di un algoritmo piu' efficiente per ottenere lo
stesso ordinamento, in ambiente C++
N.B. Le parti 3 e 4
verranno svolte nella prossima esercitazione, ma sono logicamente
legate al tema di questa esercitazione