lunedì 9 dicembre 2013

Note sulla memoria dinamica e nuova esercitazione

Disponibili le note sulla gestione dinamica della memoria e una nuova esercitazione.
Per lo svolgimento dell'esercitazione potete scaricare queste implementazioni delle classi Razionale e Complex.

9 commenti:

  1. Nello svolgimento del quarto esercizio, nell'implementazione della funzione "unione", come posso far ritornare un terzo oggetto in modo da non modificare i due oggetti originali?

    (sotto il link dello screenshot della funzione utilizzando new, ma so che è un modo sbagliato, perché non si può poi liberare la memoria)
    http://postimg.org/image/x11rbwh3b/

    RispondiElimina
  2. E' sufficiente che fai ritornare un valore invece di un riferimento e che all'interno della funzione dichiari third semplicemente come variabile locale che viene distrutta quando esci dalla funzione (quello che ritorni sara' una copia di third).

    RispondiElimina
  3. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  4. Compilando un programma di test che utilizza la classe di oggi compare questo warning:
    vector_test.cpp:15:13: warning: no viable constructor copying parameter of type 'Vector'; C++98 requires a copy constructor when binding a reference to a temporary [-Wbind-to-temporary-copy]
    cout<<(v1+v2)<>v1»v2;

    Il programma crea semplicemente due Vector v1 e v2, li inizializza con i valori inseriti dall'utente e ne stampa la somma:
    12 cout<<(v1+v2)«endl;
    Da quello che capisco è dovuto al fatto che il valore di ritorno dell'operatore + è un Vector, quindi non si può utilizzare il costruttore di copie per compiere l'assegnamento, che quindi viene fatto membro a membro nello standard c++11. Ho capito bene? Cosa si può fare per risolvere?

    RispondiElimina
  5. Dai frammenti di codice che riporti nel commento non si può dire nulla sul problema che incontri. Inviami il codice per email che vedo di cosa si tratta.

    RispondiElimina
  6. Ho guardato il codice che mi hai inviato e ti confermo che il warning e' dovuto al fatto che operator+ e operator- restituiscono un Vector (non un riferimento) e quindi necessitano di un costruttore di copie. Il tuo costruttore di copie non lo può usare perché accetta un Vector& mentre tu all'interno di operator+ e operator- lavori con const Vector&. La soluzione e' semplicemente di scrivere correttamente il costruttore di copie con un parametro const Vector& invece che Vector&.

    RispondiElimina
  7. @Fabio Cappello: comunque il codice e' ben scritto, potresti sistemare il costruttore di copie e pubblicarlo interamente o se preferisci lo posso pubblicare io. Penso potrebbe tornare utile anche ai tuoi colleghi.

    RispondiElimina
  8. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  9. Grazie per la spiegazione.
    Qui c'è il codice:
    https://dl.dropboxusercontent.com/u/3484706/vector.cpp https://dl.dropboxusercontent.com/u/3484706/vector.h https://dl.dropboxusercontent.com/u/3484706/vector_test.cpp

    RispondiElimina