Oppure

Loading
06/02/12 17:18
McFly
Salve ragazzi,
sono ancora qui a chiedervi aiuto, probabilmente è una stupidata e spero che riusciate ad aiutarmi!

In pratica ho dei problemi quando implemento un metodo che mi consenta di scambiare il contenuto di due oggetti uguali!

Premetto che i miei oggetti sono dei puntatori a classe e premetto anche che ho implementato il relativo costruttore di copia che funziona(testato)!

Il metodo che sto cercando di implementare è semplice semplice:

void D_class::ScambiaOggetti(B *obj1,B *obj2)
{
    B *temp;
    temp = obj1;
    obj1 = obj2;
    obj2 = temp;
}


Questo metodo così scritto non funziona, infatti se accedo prima e dopo ai rispettivi attributi di questi due oggetti, non è cambiato niente, e i valori non si sono scambiati.

Se però aggiungo al prototipo del mio metodo...una bella & tutto funziona magicamente!

void D_class::ScambiaOggetti(B *&obj1,B *&obj2)


Fatta questa premessa... il mio problema è che io voglio utilizzare questo metodo anche con due oggetti che appartengono ad una classe derivata da B e sfruttare quello che è l'upcasting!

  class X : public B


cioè voglio che la mia chiamata si adatti anche a questo...

X *obj1,*obj2;
ScambiaNodi(obj1,obj2); // 



Il compilatore non mi dice niente(come è giusto che sia poichè l'upcasting avviene implicitamente) quando nel prototipo del mio metodo non aggiungo la &, ma quando l'aggiungo purtroppo mi da un errore nella chiamata

error:invalid inizialization of reference of type B *& from expression of type...

e di seguito anche questo errore...

error:in passing argument 1 of void ScambiaOggetti(B *&,B *&)'



Sembra quasi che & abbia annullato l'upcasting! :(

Sapete spiegarmi il perchè?
Esiste una soluzione a questo problema?
Esiste magari una soluzione anche più pulita o questo è quello che deve farsi e magari aggiungere qualche altra cosa???

Grazie mille in anticipO!



aaa
06/02/12 17:29
Pitagora
Beh, per gli errori che hai sollevato in questi ultimi post, un buon libri ti fare solamente del BENE. Comunque non devi agire sugli indirizzi bensì sul valore contenuto negli indirizzi.

1* metodo - Passaggio per riferimento &
void D_class::ScambiaOggetti(B &obj1,B &obj2) // oggetti non costanti
{     
     B temp;     
     temp = obj1;     
     obj1 = obj2;     
     obj2 = temp; 
}


2* metodo - Passaggio per riferimento *
void D_class::ScambiaOggetti(B *obj1,B *obj2) // oggetti non costanti
{     
     B temp;     
     temp = *obj1;     
     *obj1 = *obj2;     
     *obj2 = *temp; 
}
aaa