Newsgroup: it.comp.lang.c++
Titolo: Ritornare un oggetto per reference...

Ciao a tutti.
Mi potreste spiegare in dettaglio cosa succede quando si ritorna un oggetto
per reference da una funzione?
Ad es. , se scrivo:
class A {
public:
  const B& f() const { return b };
private:
  B b;
};
int main( void )
{
A a;
B otherB = a.f();
return 0;
}
cosa succede? Nello stack viene passato l'indirizzo di A::b? E poi? Forse
viene chiamato il costruttore di copia per copiare da A::b a otherB ?
Se è come ho appena detto, questo metodo può essere usato *solo* per
ritornare data member, perchè se ritornassi un oggetto creato all'interno
della funzione, passerei un reference a zualcosa che viene distrutto nel
momento dell'uscita dalla funzione...
GRAZIE
Daniele.

 momento dell'uscita dalla funzione...
Giusta la frase dal "perche`" alla fine, sbagliata dal "se" a "data
member".  Quello che consegue dalla seconda parte e` che la reference
tornata dev'essere ad un qualsiasi oggetto (del giusto tipo) la cui
lifetime ecceda quella della funzione:
    -- un data member va bene, ma anche
    -- un oggetto globale, o magari
    -- uno static della funzione stessa
    -- e qualsiasi altro oggetto di lifetime sufficientemente
        esteso su cui la funzione possa in qualche modo
        mettere le grinfie magari attraverso puntatori o
        reference o argomenti o ...
Un esempio di quest'ultimo uso:
template<class T, class confronta=std::less<T> >
T& ilpiubello(T& a, T& b, const confronta& c = std::less<T>())
{
    if(c(a,b)) return b;
    return a;
}
void prova()
{
    int a=15, b=69;
    ilpiubello(a,b) = 43;
    // ora b vale 43, a e` intonso
    // ...
}
Non e` un uso frequentissimo, ma quando serve fa proprio comodo!
Alex

{
 >  int a=15, b=69;
 >  ilpiubello(a,b) = 43;
 > std::cout << "a = " << a << " b = " << b << std::endl;
 > // ora b vale 43, a e` intonso
 > // ...
 >}
<snippino>
Ho 2 domande:
1) non so dove trovare less, il VisualC++ mi dice che less non e´ membro di
std, anche se includo <algorithm> l´errore rimane.
Ho allora chiamato il bell´help MSDN che mi spiega ben poco...mi fa vedere
che less e´ un bellissimo template <class T> struct less: ..ecc ecc. ma non
mi fa uno straccio di esempio per dirmi come poterlo usare, cosa includere e
compagnia cantante.Certo ...MSDN e´ mastodontico ma per noi novellini
sarebbe utile avere degli esempi ogni tanto, invece che kg di definizioni.
Questo di less e´ solo un esempio, altre volte sono andato a cercare
nell´help e mi e´ stata fornita una spiegazione ciclopica ed enciclopedica
che mi ha lasciato di stucco, attonito e costernato perche´ poi mancava un
bell´esempio che mi schiarisse le idee alquanto confuse a quel punto.
2) Ma se T e´ una classe  allora la funzione ilpiubello, vuole come
argomenti 2 riferimenti agli oggetti della classe T e restituisce un
riferimento ad uno dei due.
Allora come mai in prova() viene chiamata passandogli 2 int  ?
E´qua il caso di usare typename invece di class oppure anche sull´argomento
typename ho toppato alla grande?
Anche se non ho capito il tuo esempio, volevo dirti che sicuramente ti
preferisco alla MSDN perche´ dai spiegazioni e le incornici con esempi, cosa
rara oserei dire.

 rara oserei dire.
Penso che dei semplici esempi servano, ma non sempre ho il tempo di
controllare se ho tutte le virgole al posto giusto (ecc) compilando
il codice di esempio che propongo, e la mia scelta di postare esempi
e` per questo stata criticata.  Ho chiesto feedback in merito al
gruppo, e non ne ho ottenuto alcuno ne` in un verso ne` nell'altro,
quindi ripeto la richiesta: se ho il tempo di buttare giu` un esempio.
ma non quello in piu` per controllare tutti i dettagli sintattici e
garantire che compili e faccia proprio quel che serve, e` meglio che
eviti proprio di rispondere (o almeno di dare l'esempio), come quel
critico suggeriva, o e` meglio che, come ho sempre fatto, io dia
l'esempio (e il resto della risposta) comunque?
Alex


Intanto ti ringrazio per i tuoi impagabili(se fossero pagabili penso che tu
sia troppo caro per il mio stipendio di programmatore (in C...futuro C++)
alla Ericsson...) suggerimenti ed esempi.
E poi, per quanto riguarda il feedback che richiedi, ti invito caldamente
 e come me, penso tanti altri novellini del C++) a continuare pure ad
abbellire con esempi le tue risposte.
Una virgola di troppo o un #include in meno e´ ben poca cosa rispetto al
grosso aiuto che un esempio fornisce nel chiarire un tuo discorso teorico.
In parole povere, discutere di teoria e´ bello si´ ma se per postare un
esempio si pretende pure che questo sia perfetto dal punto di vista
sintattico, allora si posterebbero solo esempi banali ed inutili oppure voi
"guru" sarete costretti a perdere un sacco di tempo di debugging e alla
lunga rinuncereste.
Continua cosi´!


Io sono per l'esempio in ogni caso.
Francesco

 gruppo, e non ne ho ottenuto alcuno ne` in un verso ne` nell'altro,
Forse non ti è arrivato il mio messaggio o non era chiaro: io sono
completamente a favore dei tuoi (o di altri) esempi, anche se non
perfetti. C'è sempre tempo a chiedere chiarimenti.
EMG

 Alex
Dai l'esempio, dai l'esempio!!! e noi novelli te ne saremo infinitamente
grati!
e se passi da Bologna ti offro pure una pizza!!!
Ciao!
--
Ciao by Beppe
Solo chi č stupido non cambia mai idea
(Aldo, "Cosě č la vita")

 e se passi da Bologna ti offro pure una pizza!!!
A Bologna ci abito (ci sono nato, ci sono cresciuto, ci
ho studiato, ci lavoro...) quindi e` difficile che "ci
passi"...!-)
Alex


Anch' io  sono per l'esempio in ogni caso!
Molte volte un esempio è molto più chiaro di mille parole.
Se poi c'è dentro qualche errore (a livello di ; mancanti o simili) non
concettuale, non sarà difficile scovarlo e correggerlo.
Gerolamo

l'esempio (e il resto della risposta) comunque?
La seconda che hai detto :-)