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++ - sovraccaricare un operatore in una struct
Forum - C/C++ - sovraccaricare un operatore in una struct

Avatar
sghisha (Normal User)
Newbie


Messaggi: 9
Iscritto: 03/06/2013

Segnala al moderatore
Postato alle 14:39
Venerdì, 21/06/2013
ciao a tutti
vorrei sovraccaricare l'operatore "==" per un tipo struct.
Codice sorgente - presumibilmente C++

  1. typedef enum CodiceRichiesta {disturbo,assistenza} CodiceRichiesta;
  2. struct nodo{
  3.         int idUtente;
  4.         CodiceRichiesta richiesta;
  5. };



questa è la struct che devo utilizzare e mi serve comparare due elementi di tipo nodo.
grazieeeeeeeeee....:hail:

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 15:32
Venerdì, 21/06/2013
si fa esattamente come per le classi.

In C++, le struct e le classi sono quasi totalmente identiche, solo che le classi hanno default scope "private" mentre le struct sono default "public". Fine.

PM Quote
Avatar
sghisha (Normal User)
Newbie


Messaggi: 9
Iscritto: 03/06/2013

Segnala al moderatore
Postato alle 15:56
Venerdì, 21/06/2013
ok...
ci sono riuscita in questo modo
Codice sorgente - presumibilmente C++

  1. bool operator ==(nodo &a, nodo &b){
  2.         if ((a.idUtente==b.idUtente)&&(a.richiesta==b.richiesta)){
  3.                 return true;
  4.         }
  5.         else
  6.         return false;
  7. }




poi se volessi stampare a video il tipo nodo? ho provato questo
Codice sorgente - presumibilmente C/C++

  1. void operator  << (nodo a){
  2.         cout<<a.idUtente;
  3.         cout<<a.richiesta;
  4. }



ma evidentemente non va bene.

PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 20:24
Venerdì, 21/06/2013
Testo quotato

Postato originariamente da sghisha:

ok...
ci sono riuscita in questo modo
Codice sorgente - presumibilmente C++

  1. bool operator ==(nodo &a, nodo &b){
  2.         if ((a.idUtente==b.idUtente)&&(a.richiesta==b.richiesta)){
  3.                 return true;
  4.         }
  5.         else
  6.         return false;
  7. }




poi se volessi stampare a video il tipo nodo? ho provato questo
Codice sorgente - presumibilmente C/C++

  1. void operator  << (nodo a){
  2.         cout<<a.idUtente;
  3.         cout<<a.richiesta;
  4. }



ma evidentemente non va bene.


L'operatore << è binario, quindi per forza di cose deve prendere due parametri

quindi intanto sarà
Codice sorgente - presumibilmente C/C++

  1. QUALCOSA operator << (QUALCOSA, QUALCOSA2)
  2. {
  3. ...
  4. }


come si fa a capire cos'è quel qualcosa? Beh basta guardare il codice più banale del mondo
Codice sorgente - presumibilmente Plain Text

  1. cout << "Hello world!" << "\n";


Ho usato "\n"  al posto di endl per semplificare la spiegazione ma le cose non cambiano in quel caso.

In pratica quella riga in realtà viene vista dal compilatore come:
Codice sorgente - presumibilmente Plain Text

  1. (cout << "Hello world!") << "\n"


(Si noti che l'operatore <<, come +, - e molti altri è associativo a sinistra)

A questo punto è ovvio che il risultato non può essere void, altrimenti (void) << "\n" avrebbe poco senso.
Invece ha senso che "\n" venga mandato a sua volta sullo stesso stream, e cioè cout.
E quindi vuol dire che il risultato della parentesi interna (cout << "Hello world!") è cout, e cioè il tipo di ritorno è std::ostream&

Poiché cout << "Hello world!" è un'espressione binaria, e a destra ha una stringa, a sinistra ha ancora cout, il tipo della funzione in questo caso sarà:

Codice sorgente - presumibilmente C/C++

  1. std::ostream& operator <<(std::ostream& out, const char* string)
  2. {
  3. ...
  4. }



Nel tuo caso ti basta fare:
Codice sorgente - presumibilmente C#

  1. std::ostream& operator<<(std::ostream& out, node& n) /* o meglio, std::ostream& operator<<(std::ostream&out, const node& n), ma mi sa che all'università non te lo dicono :P*/
  2. {
  3.     out << n.idUtente << n.richiesta;
  4.     return out;
  5. }



O una cosa simile, insomma formatta l'output a tuo piacimento.
Ricorda quel return alla fine, serve per permettere la concatenzione di più <<.

Ultima modifica effettuata da lumo il 21/06/2013 alle 20:47
PM Quote