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++ - Problema con la lista in c++ (errore che non riesco ad interpretare)
Forum - C/C++ - Problema con la lista in c++ (errore che non riesco ad interpretare)

Avatar
elio_2he (Normal User)
Newbie


Messaggi: 6
Iscritto: 25/05/2015

Segnala al moderatore
Postato alle 10:28
Mercoledì, 02/09/2015
Salve a tutti
Sto scrivendo un piccolo programma in c++,ho creato una classe "filem" da cui ho ereditato una classe "foto" poi ho creato una terza classe "lista" per gestire gli oggetti di filem ( e spero anche quelli di "foto" dato che è ereditata da filem)
il codice della classe lista è il seguente:

Codice sorgente - presumibilmente C++

  1. #include "foto.h"
  2.  
  3.  
  4. //typedef filem T;
  5.  
  6. struct record;
  7.  
  8. struct record{
  9.        
  10.        record * next;
  11.        filem elem;
  12.        
  13.       };
  14.  
  15. class lista{
  16.       private:
  17.               record * testa;
  18.               void clear();
  19.       public:
  20.              lista (){testa=0;}
  21.              lista(const lista &);
  22.              const lista & operator=(const lista &);
  23.              bool ins_top(const filem &);  
  24.              bool ins_back(const filem &);
  25.              bool remove_top(filem &);
  26.              bool remove_back(filem &);
  27.              void print ()const;
  28.              int lenght ()const;
  29.              bool inlista(const filem &)const;     // qui ho il problema !
  30.              bool empty()const{return testa==0;}
  31.              ~lista();
  32.              
  33.       };



ho un problema con l'implementazione della funzione bool  inlista (const filem &) const;
il codice di implementazione è questo:

Codice sorgente - presumibilmente C/C++

  1. bool lista::inlista(const filem & e)const {
  2.      
  3.      record * temp=testa;
  4.      bool trovato=false;
  5.      while(temp && ! trovato){
  6.                  
  7.                  if(temp->elem == e)// secondo il compilatore qui c'è l'errore!!
  8.                  trovato=true;
  9.                  
  10.                  else temp=temp->next;
  11.                  
  12.                  return trovato;
  13.      
  14.      }
  15.  
  16. }


e il compilatore mi da il seguente messaggio:
no match for 'operator=='in 'temp->record :: elem == e'
da quanto ho capito io non riesce a fare il confronto tra 'elem' ed 'e' ma elem è una variabile di tipo "filem" e pure 'e' è di tipo filem quindi non so proprio come risolvere l'errore e soprattutto se ho capito bene l'errore!
Grazie per la disponibilità!:)




PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 13:25
Mercoledì, 02/09/2015
Invece il compilatore ha ragione e devi fartene una ragione, che ti piaccia o no. Cosa significa confrontare un oggetto con un'altro per te? Sei sicuro che non intendessi comparare i due puntatori ad oggetto? Come sarebbe a dire "e spero" o è possibile o non è......

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 14:39
Mercoledì, 02/09/2015
Mi sa che dovresti sottoporre l'operatore "==" a un bell'overload...


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 18:55
Giovedì, 03/09/2015
Testo quotato

Postato originariamente da TheDarkJuster:
Invece il compilatore ha ragione e devi fartene una ragione, che ti piaccia o no. Cosa significa confrontare un oggetto con un'altro per te? Sei sicuro che non intendessi comparare i due puntatori ad oggetto? Come sarebbe a dire "e spero" o è possibile o non è......


Quante parole per dire "non so aiutarti"

Testo quotato

elio_2he
e il compilatore mi da il seguente messaggio:


no match for 'operator=='in 'temp->record :: elem == e'

Come dice AldoBaldo e come ti dice anche il compilatore, devi fare l'overload di operator==, che significa scrivere questa funzione:
Codice sorgente - presumibilmente C/C++

  1. bool operator==(const filem& f1, const filem& f2) {
  2. // ritorna vero se f1 è uguale a f2
  3. }


Il motivo di ciò è che il compilatore non sa come gestire l'uguaglianza tra tipi che non siano primitivi (nel tuo caso è facile, ma in casi più complessi si potrebbero avere più modi di comparare due oggetti e sta al programmatore decidere quale sia quello semanticamente utile).

Testo quotato

elio_2he
Sto scrivendo un piccolo programma in c++,ho creato una classe "filem" da cui ho ereditato una classe "foto" poi ho creato una terza classe "lista" per gestire gli oggetti di filem ( e spero anche quelli di "foto" dato che è ereditata da filem)




Purtroppo no, perché nella struct hai messo:
Codice sorgente - presumibilmente Plain Text

  1. filem elem;


In questo modo elem può essere solo un elemento filem, perché il compilatore vedere che quello è il suo tipo.
Ci sono due modi di risolvere
1) il modo più semplice è usare un puntatore, così puoi sfruttare il polimorfismo; la classe lista va bene così come interfaccia (usi i reference) però dovrai cambiare il codice dei metodi
2) Usi i template e parametrizzi lista sul tipo (e a quel punto diventa simile a std::list della standard library)


Ultima modifica effettuata da lumo il 03/09/2015 alle 18:58
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 19:55
Giovedì, 03/09/2015
Codice sorgente - presumibilmente C/C++

  1. struct record{
  2.        record *next;
  3.        filem *elem;
  4. };



Cambi il codice dove utilizzi record->elem e lo fai diventare *(record->elem) (asegni a record->elem=.... con record->elem=&.......). Così potrai gestire anche foto con quella lista. Di contro avrai la necessità di liberare manualmente la memoria (se record->elem NON punta a un oggetto sullo stack).

Io non ho detto niente che non vada, volevo solo che l'utente mi dicesse "voglio che le proprietà dei vari oggetti siano uguali" e non "voglio che l'oggetto sia lo stesso". lumo non ti permettere di creditare senza un valido motivo gli altri membri.

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 20:35
Giovedì, 03/09/2015
:ot: rimaniamo in topic. Conversazioni personali fatele in privato.


Il mio blog: https://piero.dev
PM Quote