Procedure preliminari

  1. controllate che nella HOME directory sia presente il file con i vostri nomi
  2. create un sottodirettorio es_5
  3. spostatevi in es_5 Solo i files contenuti in /home/did.../es_5 verranno presi in considerazione!
  4. copiate nella directory es_5 i file CorpoCeleste.h e CorpoCeleste.cc che avete scritto durante le scorse esercitazioni
  5. usate emacs per creare il codice del programma richiesto (esempio: emacs esercit_5.cpp &): ricordatevi che ogni programma dovra' iniziare con una riga di commento in cui indicherete i nomi dei componenti del gruppo presenti all'esercitazione
  6. il programma verra' valulatato 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 familiarita' con
In particolare dovrete mettere in evidenza le modalita' di creazione e di distruzione degli oggetti istanziati in maniera dinamica  e confrontarle con il comportamento di gestione della memoria che gia' conoscete.


Il testo dell'esercitazione

Costruire un programma main che

                - riempia un array di double e un array di oggetti CorpoCeleste;
                - ne stampi su video l'elenco con le caratteristiche
                - scorra gli array e ne visualizzi il contenuto utilizzando l'indice dell'array oppure il puntatore

                - riempia un vettore puntatori a double e di puntatori a oggetti di tipo CorpoCeleste.
                - ne stampi su video l'elenco con le caratteristiche 
                - scorra gli array e ne visualizzi il contenuto utilizzando l'indice dell'array oppure il puntatore

Se scrivete anche il valore del puntatore (a double e a CorpoCeleste) e del puntatore di puntatore, potete valutare quanto e' "grande" (cioe' quanto spazio occupa in memoria) un double o un oggetto di tipo CorpoCeleste.

Una volta costruito il programma richiesto
 
- valutate che cosa accade se memorizzate un oggetto istanziato in uno scope
- valutate che cosa accade se memorizzate il puntatore ad un  oggetto istanziato in uno scope

- utilizzate l'allocazione dinamica della memoria ( istruzione new ) per istanziare gli oggetti all'interno di uno scope e valutate il diverso comportamento rispetto al caso precedente

- istanziate anche i vettori (di double, di oggetti CorpoCeleste, di puntatori a double e puntatori a CorpoCeleste) e valutatene il diverso comportamento

Inserite nel programma le istruzioni delete richieste (devono corrispondere alle istruzioni new ) e valutate, tramite l'uso del distruttore intelligente, il diverso comportamento della distruzione degli oggetti istanziati in maniera dinamica.


Osservazioni

1)    Per rendere piu' esplicito il ruolo del Distruttore, e' utile implementare il Distruttore in forma intelligente, con un messaggio che avverta l'utente dell'avvenuta distruzione.


2)    Per permettere di istanziare un Corpoceleste o un vettore di oggetti di tipo CorpoCeleste, e' necessario introdurre il costruttore senza parametri, che viene spesso utilizzato. In CorpoCeleste.h e’ implementato tale costruttore: verificare che se non e’ presente il Costruttore senza parametri, non e’ possibile istanziare un vettore di oggetti di tipo CorpoCeleste

Se volete, potete implementare un Costruttore intelligente, con un messaggio che vi aiuti a capire che cosa sta succedendo e come viene gestita la memoria.

3)    Per permettervi di scrivere una stringa  in funzione di un indice di un for (ad esempio "Ausi_1", "Ausi_2", ecc.) ad esempio per assegnare un diverso nome agli oggetti CorpoCeleste istanziati in un loop, puo' essere utile la seguente serie di istruzioni

#include <string>      // da aggiungere, all'inizio del programma,   

#include <sstream>     // agli altri include gia' presenti
........


ostringstream os ;    // os e' un nome a vostra scelta

os << i ;             // i e' il numero, gia' esistente,
                      // che si vuole scrivere come carattere

    string s = os.str();  // ora s contiene i come carattere.
                         
// Ad esempio, se il valore di i era 3 ora s vale "3"