Oppure

Loading
21/06/13 12:39
sghisha
ciao a tutti
vorrei sovraccaricare l'operatore "==" per un tipo struct.
typedef enum CodiceRichiesta {disturbo,assistenza} CodiceRichiesta;
struct nodo{
	int idUtente;
	CodiceRichiesta richiesta;
};


questa è la struct che devo utilizzare e mi serve comparare due elementi di tipo nodo.
grazieeeeeeeeee....:hail:
aaa
21/06/13 13:32
TheKaneB
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.
aaa
21/06/13 13:56
sghisha
ok...
ci sono riuscita in questo modo
bool operator ==(nodo &a, nodo &b){
	if ((a.idUtente==b.idUtente)&&(a.richiesta==b.richiesta)){
		return true;
	}
	else
	return false;
}



poi se volessi stampare a video il tipo nodo? ho provato questo
 void operator  << (nodo a){
	cout<<a.idUtente;
	cout<<a.richiesta;
}


ma evidentemente non va bene.
aaa
21/06/13 18:24
lumo
Postato originariamente da sghisha:

ok...
ci sono riuscita in questo modo
bool operator ==(nodo &a, nodo &b){
	if ((a.idUtente==b.idUtente)&&(a.richiesta==b.richiesta)){
		return true;
	}
	else
	return false;
}



poi se volessi stampare a video il tipo nodo? ho provato questo
 void operator  << (nodo a){
	cout<<a.idUtente;
	cout<<a.richiesta;
}


ma evidentemente non va bene.

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

quindi intanto sarà
QUALCOSA operator << (QUALCOSA, QUALCOSA2)
{
...
}

come si fa a capire cos'è quel qualcosa? Beh basta guardare il codice più banale del mondo
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:
(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à:

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


Nel tuo caso ti basta fare:
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*/
{
    out << n.idUtente << n.richiesta;
    return out;
}


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 21/06/13 18:47
aaa