Dans un projet sur lequel je travaille, j'ai une classe Score
, définie ci-dessous dans score.h
. J'essaye de le surcharger ainsi, quand une opération <<
est exécutée là-dessus, _points + " " + _name
est imprimé.fonctions 'friend' et << surcharge de l'opérateur: Quelle est la bonne façon de surcharger un opérateur pour une classe?
Voici ce que j'ai essayé de le faire:
ostream & Score::operator<< (ostream & os, Score right)
{
os << right.getPoints() << " " << right.scoreGetName();
return os;
}
Voici les erreurs renvoyées:
score.h(30) : error C2804: binary 'operator <<' has too many parameters
(Cette erreur apparaît 4 fois, en fait)
j'ai réussi à le faire fonctionner en déclarant la surcharge comme une fonction d'ami:
friend ostream & operator<< (ostream & os, Score right);
Et en supprimant le Score::
de la déclaration de fonction dans score.cpp (en fait ne pas le déclarer en tant que membre).
Pourquoi cela fonctionne-t-il, mais pas l'ancien morceau de code?
Merci pour votre temps!
EDIT
J'ai supprimé toutes les mentions de la surcharge sur le fichier d'en-tête ... mais je reçois l'erreur suivante (et seulement). binary '<<' : no operator found which takes a right-hand operand of type 'Score' (or there is no acceptable conversion)
Comment se fait-il que mon test, dans main(), ne trouve pas la surcharge appropriée? (Ce ne sont pas les comprend, j'ai vérifié)
est inférieure à la score.h pleine
#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
Nice, réponse complète. –
Accéder aux parties privées de la classe - Rawr. J/K, merci beaucoup, mais une question demeure: J'ai supprimé toutes les mentions à la surcharge sur le fichier d'en-tête ... mais je reçois l'erreur suivante (et seulement). 'binary '<<': aucun opérateur trouvé qui prend un opérande de droite de type 'Score' (ou il n'y a pas de conversion acceptable)' Comment se fait-il que mon test, dans main(), ne trouve pas l'approprié surcharge? (ce n'est pas les inclus). –
Vous devez mettre la déclaration de l'opérateur << 'right avec la définition de votre classe: c'est dans le même en-tête et dans le même espace de noms. De cette façon, vous n'oublierez pas de l'inclure et le compilateur pourra le ramasser en cherchant des surcharges acceptables. –