Newsgroup: it.comp.lang.c++
Titolo: [stile] Utilizzare un puntatore o un reference.

Ho iniziato a leggere "C++ Effective Object-Oriented Software
Construction" e parlando di come passare gli argomenti ad una funzione
ad un certo punto dice: "Don't pass pointers when you mean to pass
objects".
In pratica il discorso č semplice. Se devo passare un oggetto ad un
funzione che lo deve modificare raccomanda di utilizzare i reference
(es. void f (T& obj) ) invece dei puntatori (es. void f(T* obj) )
giustificando che in questa maniera sei sicuro che ti verrą passato "a
live object" non un null pointer.
Il ragionamento tutto sommato fila, e dice di utilizzare i puntatori
solo se il lifetime dell'oggetto viene affidato alla funzione chiamata,
che cosģ lo puņ distruggere quando vuole.
Il fatto č che mi sembra di ricordare che Stourstroup affermasse
esattamente il contrario: di non utilizzare i reference se non per
passare oggetti const, in quanto, sempre se non ricordo male,
utilizzando i puntatori era pił chiaro che la funzione era intenzionata
a modificare l'oggetto. Infatti chiamando f, anche senza avere sotto il
prototipo della funzione, in questa maniera risulterebbe chiaro se f
intende modificare l'oggetto che gli viene passato o no.
So che č una sottigliezza piuttosto inutile, ma sono incuriosito. Voi
cosa ne pensate?
Ciao Fbf.

 cosa ne pensate?
Sono quelle che generano le discussioni migliori :-)
Ciao,
Nicola

fastidio per l'eccesso di asterischi :-)
Capita anche a me! Odio i pezzi di codice il cui carattere più usato è
l'asterisco 8-)
Luc.

 a modificare l'oggetto. Infatti chiamando f, anche senza avere sotto il
Questione di stile. Entrambe i ragionamenti sono validi se la scelta non e'
imposta dall'esterno (per esempio se ti interfacci con routine C).
L'importante e che documenti la tua scelta e cerchi se possibile di essere
coerente. E soprattutto che stradocumenti eventuali eccezioni alla regola.
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

intende modificare l'oggetto che gli viene passato o no.
Il discorso non mi convince affatto, stando a come dice pare quasi che
si debbano usare i puntatori solo per convenzione e non perché
effettivamente siano più utili dei reference nelle funzioni che devono
modificare i parametri in ingresso.
Comunque se l'ha detto lui....
Il Ghenio
-----
James: Adesso so finalmente cosa provano i panni messi in lavatrice!
Jesse: Avremo bisogno di un candeggio!!
(Team Rocket)
-----

l'asterisco 8-)
#include <iostream>
int main() { std::cout << "**************************"; };
:-))))))))
--
Antonio Cuni, 18 anni, studente
Brainbench Certification: 
Master C++: 4.44, higher than 97% of all previous test takers.
Visual Basic 5: 3.06, higher than 77% of all previous test takers.
http://www.brainbench.com/transcript.jsp?pid=1301688

:-))))))))
'stardo... 8-P
Luc.

 Voi cosa ne pensate?
Ultimamente nelle mie librerie uso queste convenzioni:
const reference per i dati che non verranno cambiati
(in alcuni casi anche cost int& se puo' aiutare la comprensione)
e puntatori per i parametri di output. Per i parametri IN e OUT decido
caso per caso, anche se tendo ai reference (non const ovviamente).
I parametri costanti sono sempre i primi, e quelli piu' a destra
quelli di output. Se esiste un errore, e per motivi vari ho deciso che
il quel caso lanciare eccezioni non e' cosa saggia, l'errore e' cio'
che la funziona torna (un errore e' sempre e solo un enumerativo).
La prima parte del nome della funzione riguarda la classe logica di
appartenenza (se ha senso la cosa, e se le funzioni non sono chiuse in
un namespace specifico). Per esempio "Sck" per delle funzioni sui
socket. Se ha senso mettere il tipo dei parametri nel nome della
funzione vado da sinistra a destra. Una funzione per trasformare un
intero in stringa non puo' che chiamarsi nella mia convenzione con
qualcosa del tipo std::string IntToStr(int);
-- 
Tieni per te il Papero se vuoi la mia email
Sito Papero -> 
http://utenti.tripod.it/papero