In un progetto su cui sto lavorando, ho una classe Score
, definita di seguito in score.h
. Sto cercando di sovraccaricarlo così, quando viene eseguita un'operazione <<
, viene stampato _points + " " + _name
.Funzioni "amico" e << overloading dell'operatore: qual è il modo corretto di sovraccaricare un operatore per una classe?
Qui è quello che ho cercato di fare:
ostream & Score::operator<< (ostream & os, Score right)
{
os << right.getPoints() << " " << right.scoreGetName();
return os;
}
Qui ci sono gli errori restituiti:
score.h(30) : error C2804: binary 'operator <<' has too many parameters
(Questo errore compare 4 volte, in realtà)
sono riuscito a farlo funzionare dichiarando il sovraccarico come funzione amica:
friend ostream & operator<< (ostream & os, Score right);
E rimuovere Score::
dalla dichiarazione della funzione in score.cpp (non dichiararlo efficacemente come membro).
Perché funziona, ma l'ex pezzo di codice non funziona?
Grazie per il vostro tempo!
EDIT
ho cancellato tutti i riferimenti al sovraccarico sul file di intestazione ... eppure ricevo il seguente (solo e) l'errore. binary '<<' : no operator found which takes a right-hand operand of type 'Score' (or there is no acceptable conversion)
Come mai il mio test, in main(), non riesce a trovare il sovraccarico appropriato? (Non è la comprende, ho controllato)
Di seguito è la piena score.h
#ifndef SCORE_H_
#define SCORE_H_
#include <string>
#include <iostream>
#include <iostream>
using std::string;
using std::ostream;
class Score
{
public:
Score(string name);
Score();
virtual ~Score();
void addPoints(int n);
string scoreGetName() const;
int getPoints() const;
void scoreSetName(string name);
bool operator>(const Score right) const;
private:
string _name;
int _points;
};
#endif
Bella, risposta completa. –
Accedi alle parti private della classe - Rawr. J/K, grazie mille, tuttavia rimane una domanda: Ho eliminato tutte le menzioni al sovraccarico sul file di intestazione ... tuttavia ottengo il seguente (e solo) errore. 'binario '<<': nessun operatore trovato che prende un operando di destra di tipo 'Punteggio' (o non vi è alcuna conversione accettabile)' Come mai il mio test, in main(), non riesce a trovare l'appropriato sovraccarico? (non è l'include). –
Dovresti mettere la dichiarazione dell'operatore '' a destra con la definizione della tua classe: cioè nella stessa intestazione e nello stesso spazio dei nomi. In questo modo non ti dimenticherai di includerlo e il compilatore sarà in grado di prenderlo in cerca di sovraccarichi accettabili. –