Newsgroup: it.comp.lang.c++
Titolo: Overloading degli operatori

Buonasera a tutti,
torno con un quesito un po' rognoso...Almeno per me!
Dunque, nella mia classe Complex(numeri complessi) faccio l'overloading 
dell'operatore +, in modo tale da implementare la somma fra due numeri 
complessi:
Complex &Complex::operator+(Complex &oc)
{
    Complex somma(0,0);
    somma.set( partereal + oc.partereal ,parteim + oc.parteim );
    return somma;//ristorno somma oggetto che appena termina la funzione 
verrà distrutto
}
Il codice funziona, ma non sono convinto della sua validità; infatti, se 
notate restituisco un riferimento ad un oggetto definito dentro la funzione, 
che ovviamente, all'uscita di questa viene automaticamente ditrutto!Che cosa 
restituisco allora?Ho un riferimento ad un oggetto che in pratica in memoria 
non esiste più!
Il che indurrebbe a pensare che il programma dovrebbe dare qualche errore, 
ma invece no, funge perfettamente, e quando scrivo una linea di cice del 
tipo
a=b+c;
dove a, b, c sono tre oggetti Complex, funziona tutto alla perfezione e 
l'oggetto < a > vale proprio b+c!
Com'è possibile?L'oggetto all'uscita della funzione operator+ viene 
distrutto per certo, infatti ho provato ad inserire un'istruzione di 
stampa(cout<<"sono qui";) nel costruttore, ed un'istruzione di stampa nel 
distruttore(cout<<"Addio";)
Il risultato è la stampa di quattro "sono qui", e di un "addio", come 
volevai dimostrare!L'oggetto che creo in più dentro alla funzione operator+ 
è quello che mi da' l'anomalo quarto "sono qui", e all'uscita della 
funzione, viene ovviamente distrutto(ed ecco la stampa dell'unico "addio").
Com'è possibile?Non dovrebbe darmi una marea di errori nel momento in cui 
cerco di riferirmi ad un oggetto inesistente?
Grazie per un eventuale risposta!
Cordiali saluti
Giuseppe

 restituisco allora?
Restituiscilo per valore invece che per riferimento, no?
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic

 Il codice funziona, ma non sono convinto della sua validità; 
Infatti non è valido. Il comportamento di un siffatto programma è
indefinito.
Max

 restituisco allora?
Dopo "return" una variabile automatica e condannata a morte - ma il
momento dell'esecuzione è sconosciutto ;-)
-- 
Horst

 cerco di riferirmi ad un oggetto inesistente?
Ritornare un puntatore o un riferimento a un oggetto automatico 
distrutto è un comportamento cosiddetto "undefined" - al compilatore non 
è richiesto di prendere provvedimenti particolari (sarebbe troppo
difficile farlo in generale, e se segnalasse i casi semplici tacendo su 
quelli rognosi indurrebbe un falso di sicurezza proprio al momento 
sbagliato).
Notare che in generale l'overload degli operatori si fa sulla
falsariga di quanto segue:
   Complex& operator+= (const Complex& other) {
     partereal += other.partereal;
     parteim += other.parteim;
     return *this;
   }
   Complex operator+ (const Complex& lhs, const Complex& rhs) {
     return Complex(lhs) += rhs;
   }
Barone Frankenstein

Leggi quà:
http://www.eptacom.net/pubblicazioni/pub_it/iso_1.html
Non aver paura che l'oggetto che torni venga copiato. Se entra l'rvo
l'oggetto verra` allocato prima della chiamata e istanziato (chiamato un
costruttore appropriato) dentro la funzione. Guarda il pseudo-c++ degli
esempio del sito.
Saluti
-- 
int

 }
Dopo essermi studiato attentamente le vostre risposte(ringrazio ancora per 
l'interessamento) e dopo aver letto un po' sui libri ed un po' su internet 
credp di aver capito l'errore:in pratica il tutto sta nel tipo di ritorno 
dell'operatore, che è un riferimento ad un oggetto complex, il quale oggetto 
però viene poi distrutto all'uscita della funzione, generando un riferimento 
"pendente", che genera il comportamento indefinito del programma.
Se però scrivo la stessa funzione come:
Complex Complex::operator+(Complex &oc)
 {
    Complex somma;
    somma.set( partereal + oc.partereal ,parteim + oc.parteim );
    return somma;
 }
Ciò che viene restituito non è un riferimento ad un oggetto interno alla 
funzione(che poi verrebbe distrutto), ma è proprio un oggetto 
Complex!...Spero di aver compreso l'(o)rrore da me commesso, e ringrazio 
ancora tutti quanti per l'aiuto datomi!
Cordiali saluti
Giuseppe