Procedure preliminari

  1. controllate che nella HOME directory sia presente il file con i vostri nomi
  2. create un sottodirettorio es_7
  3. spostatevi in es_7 Solo i files contenuti in /home/did.../ex4 verranno presi in considerazione!
  4. usate emacs per creare il codice del programma richiesto (esempio: emacs esercit_7.cpp &): ricordatevi che ogni programma dovra' iniziare con una riga di commento in cui indicherete i nomi dei componenti del gruppo presenti all'esercitazione
  5. il programma verra' valutato se funziona (compilazione, linking e corretta esecuzione secondo quanto richiesto) e in base alla chiarezza con cui e' scritto (inserite alcuni commenti nel testo e organizzate iterazioni e selezioni in maniera chiara)


Obiettivo dell'esercitazione

    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++.

   



Il testo dell'esercitazione



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:

  1. 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’.


  1. 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.


  1. 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.


  1. Distruttori virtuali

Verificate il meccanismo di funzionamento dei distruttori, definendo o non definendo il distruttore come virtual. Accedete agli oggetti attraverso vettori di puntatori o attraverso gli oggetti stessi, e confrontate i risultati con quelli ottenuti ai punti 1 e 3



  1. 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



Suggerimenti

    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