Albi89
06-06-2008, 17:54
Ciao a tutti!
In vista di un esame ho deciso di "condividere" con voi tutti un paio di piccoli dubbi che mi attanagliano:
Il primo riguarda i metodo set e get.
Mettiamo il caso di una classe Persona che registri il nome di una persona, sotto forma di array char allocato dinamicamente.
Non mi sembra conveniente far ritornare dal metodo get_nome() il puntatore, perchè poi potrei utilizzarlo per modificare arbitrariamente un membro private.
Com'è corretto comportarsi?
Pensavo di creare un char* temporaneo "temp" e di allocare una nuova stringa, ritornado questa.
Il problema è che talvolta il metodo get_nome() potrebbe essere usato solo per stampare sul cout: in questo caso avrei allocato spazio che non potrei più recuperare...
Il secondo riguarda la realizzazione in C++ della "inclusione lasca", ossia a mezzo di puntatore.
Sia Persona una classe che definisce nome e età di una persona e Automobile una classe che contiene (in maniera lasca) una Persona.
Realizzo un codice simile:
Persona* pippo = new Persona("Pippo", 23);
Automobile pippomachine("Opel Corsa", pippo);
All'interno del costruttore di Automobile, che contiene un membro Persona* guidatore, specifico:
this->guidatore = pippo;
E' importante però che il nostro pippo "sopravviva" alla distruzione della macchina: dunque il distruttore di Automobile deve ignorare semplicemente il suo guidatore.
In molti casi, nei compiti era richiesta la creazione di nuovi oggetti sulla base di oggetti preesistenti.
In questo caso, per mantenere la relazione di "inclusione lasca", devo allocare un nuovo oggetto Persona copia di quello originale, o eseguire una "copia superficiale" del solo puntatore?
Se creo un nuovo oggetto Persona, in questo caso il distruttore dovrebbe prendersi anche la responsabilità di deallocarlo: dovrei allora aggiungere qualcosa di molto poco carino come una variabile booleana che mi informa se l'oggetto contenuto è stato allocato in fase di copia o meno, in modo da inserire un controllo nel distruttore per eventualmente deallocarlo... ma mi sembrava abbastanza brutto :oink:
Concettualmente non ho insomma ancora capito se, in caso di contenimento lasco (quindi a mezzo puntatore) è corretto copiare IL SOLO puntatore (quindi se modifico il "guidatore" della prima automobile modifico anche quello della seconda perchè sono sostanzialmente lo stesso) oppure se va realizzato ALLOCANDO un nuovo oggetto.
Grazie a tutti per i consigli :oink:
In vista di un esame ho deciso di "condividere" con voi tutti un paio di piccoli dubbi che mi attanagliano:
Il primo riguarda i metodo set e get.
Mettiamo il caso di una classe Persona che registri il nome di una persona, sotto forma di array char allocato dinamicamente.
Non mi sembra conveniente far ritornare dal metodo get_nome() il puntatore, perchè poi potrei utilizzarlo per modificare arbitrariamente un membro private.
Com'è corretto comportarsi?
Pensavo di creare un char* temporaneo "temp" e di allocare una nuova stringa, ritornado questa.
Il problema è che talvolta il metodo get_nome() potrebbe essere usato solo per stampare sul cout: in questo caso avrei allocato spazio che non potrei più recuperare...
Il secondo riguarda la realizzazione in C++ della "inclusione lasca", ossia a mezzo di puntatore.
Sia Persona una classe che definisce nome e età di una persona e Automobile una classe che contiene (in maniera lasca) una Persona.
Realizzo un codice simile:
Persona* pippo = new Persona("Pippo", 23);
Automobile pippomachine("Opel Corsa", pippo);
All'interno del costruttore di Automobile, che contiene un membro Persona* guidatore, specifico:
this->guidatore = pippo;
E' importante però che il nostro pippo "sopravviva" alla distruzione della macchina: dunque il distruttore di Automobile deve ignorare semplicemente il suo guidatore.
In molti casi, nei compiti era richiesta la creazione di nuovi oggetti sulla base di oggetti preesistenti.
In questo caso, per mantenere la relazione di "inclusione lasca", devo allocare un nuovo oggetto Persona copia di quello originale, o eseguire una "copia superficiale" del solo puntatore?
Se creo un nuovo oggetto Persona, in questo caso il distruttore dovrebbe prendersi anche la responsabilità di deallocarlo: dovrei allora aggiungere qualcosa di molto poco carino come una variabile booleana che mi informa se l'oggetto contenuto è stato allocato in fase di copia o meno, in modo da inserire un controllo nel distruttore per eventualmente deallocarlo... ma mi sembrava abbastanza brutto :oink:
Concettualmente non ho insomma ancora capito se, in caso di contenimento lasco (quindi a mezzo puntatore) è corretto copiare IL SOLO puntatore (quindi se modifico il "guidatore" della prima automobile modifico anche quello della seconda perchè sono sostanzialmente lo stesso) oppure se va realizzato ALLOCANDO un nuovo oggetto.
Grazie a tutti per i consigli :oink: