Blog del corso di Programmazione (9 CFU) tenuto da Marco La Cascia presso la sede di Agrigento dell'Universita' di Palermo per il corso di laurea in Ingegneria Gestionale e Informatica. Tratta la programmazione a oggetti in C++.
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.
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/
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).
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?
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.
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&.
@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.
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
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?
RispondiElimina(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/
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).
RispondiEliminaQuesto commento è stato eliminato dall'autore.
RispondiEliminaCompilando un programma di test che utilizza la classe di oggi compare questo warning:
RispondiEliminavector_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?
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.
RispondiEliminaHo 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@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.
RispondiEliminaQuesto commento è stato eliminato dall'autore.
RispondiEliminaGrazie per la spiegazione.
RispondiEliminaQui 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