Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Scambio Oggetti passati come parametro!
Forum - C/C++ - Scambio Oggetti passati come parametro!

Avatar
McFly (Normal User)
Newbie


Messaggi: 6
Iscritto: 06/01/2012

Segnala al moderatore
Postato alle 18:18
Lunedì, 06/02/2012
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:

Codice sorgente - presumibilmente C/C++

  1. void D_class::ScambiaOggetti(B *obj1,B *obj2)
  2. {
  3.     B *temp;
  4.     temp = obj1;
  5.     obj1 = obj2;
  6.     obj2 = temp;
  7. }



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!

Codice sorgente - presumibilmente C/C++

  1. 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!

Codice sorgente - presumibilmente C/C++

  1. class X : public B



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

Codice sorgente - presumibilmente Plain Text

  1. X *obj1,*obj2;
  2. 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...

Codice sorgente - presumibilmente C/C++

  1. 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!




PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 18:29
Lunedì, 06/02/2012
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 &
Codice sorgente - presumibilmente C/C++

  1. void D_class::ScambiaOggetti(B &obj1,B &obj2) // oggetti non costanti
  2. {    
  3.      B temp;    
  4.      temp = obj1;    
  5.      obj1 = obj2;    
  6.      obj2 = temp;
  7. }



2* metodo - Passaggio per riferimento *
Codice sorgente - presumibilmente C/C++

  1. void D_class::ScambiaOggetti(B *obj1,B *obj2) // oggetti non costanti
  2. {    
  3.      B temp;    
  4.      temp = *obj1;    
  5.      *obj1 = *obj2;    
  6.      *obj2 = *temp;
  7. }


PM