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++ - Return di un oggetto in una funzione
Forum - C/C++ - Return di un oggetto in una funzione

Avatar
coreyt (Normal User)
Rookie


Messaggi: 21
Iscritto: 28/02/2010

Segnala al moderatore
Postato alle 20:03
Lunedì, 04/03/2013
Salve a tutti.
Ho un problema con la restituzione di un oggetto in una funzione, nello specifico ho creato una classe Lista_puntatore con relativo costruttore di copia e operatore = sovraccaricato, però, quando creo una funzione che restituisce un oggetto Lista_puntatore il compilatore mi segnala il seguente errore:

no match for 'operator=' in 'l = b(Lista_puntatore<T>;) [with T = int]()'
candidates are: Lista_puntatore<T>& Lista_puntatore<T>::operator=(Lista_puntatore<T>&) [with T = int]

Per quanto riguarda la realizzazione della classe è la seguente:
Codice sorgente - presumibilmente C/C++

  1. template <class T>
  2. class Lista_puntatore : public Lista <T, Cella_lista<T> *>
  3. {
  4.      public:
  5.         ....
  6.         Lista_puntatore (Lista_puntatore<T> &lista);    //costruttore di copia
  7.         Lista_puntatore<T>& operator= (Lista_puntatore<T>& lista);     //sovraccarico operatore =
  8.         ....
  9. }



sapete dirmi perchè mi da l'errore in fase di compilazione?
Grazie in anticipo per l'aiuto.

Ultima modifica effettuata da coreyt il 04/03/2013 alle 20:04
PM Quote
Avatar
crybot (Member)
Pro


Messaggi: 115
Iscritto: 13/09/2011

Segnala al moderatore
Postato alle 21:18
Lunedì, 04/03/2013
l'errore non e` generato dalla definizione delle funzioni, ma da un'assegnazione che fai:
no match for 'operator=' in 'l = b


PM Quote
Avatar
coreyt (Normal User)
Rookie


Messaggi: 21
Iscritto: 28/02/2010

Segnala al moderatore
Postato alle 11:48
Martedì, 05/03/2013
e come potrei fare per assegnare ad l la lista restituita dalla funzione b?

PM Quote
Avatar
crybot (Member)
Pro


Messaggi: 115
Iscritto: 13/09/2011

Segnala al moderatore
Postato alle 14:19
Martedì, 05/03/2013
dovremmo vedere il pezzo di codice dal quale si genera l'errore

PM Quote
Avatar
coreyt (Normal User)
Rookie


Messaggi: 21
Iscritto: 28/02/2010

Segnala al moderatore
Postato alle 19:46
Mercoledì, 06/03/2013
Si, diciamo che stavo facendo delle prove per poter risolvere il problema, ho questa semplice funzione:

Codice sorgente - presumibilmente C/C++

  1. template <class T>
  2. Lista_puntatore<T> b (Lista_puntatore<T> l)
  3. {
  4.     Lista_puntatore<T> a;
  5.     a.insLista (5, a.primoLista());
  6.     return a;
  7. }



richiamata dal main in questo modo:

Codice sorgente - presumibilmente C/C++

  1. int main(int argc, char *argv[])
  2. {
  3.     Lista_puntatore<int> l;
  4.     l = b(l);
  5. }



invece per quanto riguarda l'operatore = dichiarato nella classe Lista_puntatore è il seguente:

Codice sorgente - presumibilmente C/C++

  1. template <class T>
  2. Lista_puntatore<T>& Lista_puntatore<T>::operator = (Lista_puntatore<T>& lista)
  3. {
  4.                    
  5.      elemLista val;
  6.      pos posizione1, posizione2;
  7.      posizione1 = lista.primoLista();
  8.      creaLista();
  9.      posizione2 = primoLista();
  10.      
  11.      while (!lista.fineLista(posizione1))
  12.      {
  13.            val = lista.leggiLista(posizione1);
  14.            insLista (val, posizione2);
  15.            posizione1 = lista.succLista (posizione1);
  16.            posizione2 = ultimoLista();  
  17.      }
  18.      
  19.      return *this;
  20. }



e, se può servire, il costruttore di copia invece è il seguente:

Codice sorgente - presumibilmente C/C++

  1. template <class T>
  2. Lista_puntatore<T>::Lista_puntatore (Lista_puntatore<T> &lista)
  3. {
  4.     pos posizione1, posizione2;
  5.     posizione1 = lista.primoLista();
  6.     creaLista();
  7.     posizione2 = primoLista();
  8.    
  9.     while (!lista.fineLista(posizione1))
  10.     {
  11.           insLista (lista.leggiLista(posizione1), posizione2);
  12.           posizione1 = lista.succLista(posizione1);
  13.           posizione2 = ultimoLista();
  14.     }
  15. }



Grazie per le risposte.

PM Quote
Avatar
crybot (Member)
Pro


Messaggi: 115
Iscritto: 13/09/2011

Segnala al moderatore
Postato alle 16:32
Giovedì, 07/03/2013
devi permettere all'overload dell'operatore di assegnamento di accettare riferimento costanti, questo perche` l'oggetto ritornato dalla funzione b() e` un l-value, che non puo` comparire sulla destra di un espressione che ne richiede il riferimento senza il qualificatore const, quindi:
const Lista_puntatore<T>& operator= (const Lista_puntatore<T>& lista);

la restituzione di un oggetto const impedisce assegnamenti del tipo (a = b) = c

Ultima modifica effettuata da crybot il 07/03/2013 alle 18:12
PM Quote
Avatar
coreyt (Normal User)
Rookie


Messaggi: 21
Iscritto: 28/02/2010

Segnala al moderatore
Postato alle 16:56
Venerdì, 08/03/2013
Grazie mille, ora funziona :) comunque non ho capito bene il perchè necessita di const, potresti rispiegarmelo gentilmente?

PM Quote
Avatar
crybot (Member)
Pro


Messaggi: 115
Iscritto: 13/09/2011

Segnala al moderatore
Postato alle 18:59
Venerdì, 08/03/2013
Testo quotato

Postato originariamente da coreyt:

Grazie mille, ora funziona :) comunque non ho capito bene il perchè necessita di const, potresti rispiegarmelo gentilmente?



si, in effetti ho fatto un po' di confusione:

la tua funzione b() restituisce un r-value, poiche` un oggetto restituito da una funzione e` un l-value soltanto se restituito come un riferimento.
A questo punto tu passi all'operatore ridefinito di assegnamento un r-value come riferimento, ma il compilatore non te lo permette perche` potresti rischiare di modificare il parametro, quindi richiede const.

spero di essermi spiegato meglio :)

PM Quote
Avatar
coreyt (Normal User)
Rookie


Messaggi: 21
Iscritto: 28/02/2010

Segnala al moderatore
Postato alle 22:03
Venerdì, 08/03/2013
Si si ora ho capito meglio. Grazie per la pazienza :)

PM Quote