В проекте, над которым я работаю, у меня есть класс Score
, определенный ниже в score.h
. Я пытаюсь перегрузить его так, когда на нем выполняется операция <<
, печатается _points + " " + _name
.Функции «друга» и «перегрузка оператора»: каков правильный способ перегрузить оператор для класса?
Вот что я пытался сделать:
ostream & Score::operator<< (ostream & os, Score right)
{
os << right.getPoints() << " " << right.scoreGetName();
return os;
}
Вот ошибки, возвращаемые:
score.h(30) : error C2804: binary 'operator <<' has too many parameters
(Эта ошибка появляется в 4 раза, на самом деле)
мне удалось получить его работу путем объявления перегрузки как функции друга:
friend ostream & operator<< (ostream & os, Score right);
И удаление Score::
из объявления функции в score.cpp (фактически не объявляя его как член).
Почему это работает, но прежний фрагмент кода нет?
Спасибо за ваше время!
EDIT
Я удалил все упоминания к перегрузке файла заголовка ... но я получаю следующее (и только) ошибки. binary '<<' : no operator found which takes a right-hand operand of type 'Score' (or there is no acceptable conversion)
Почему мой тест в main() не может найти соответствующую перегрузку? (Это не включает в себя, я проверил)
Ниже приводится полный 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
Хороший, полный ответ. –
Доступ к частным частям класса - Rawr. J/K, большое спасибо, но остается один вопрос: Я удалил все упоминания о перегрузке в файле заголовка ... но я получаю следующую (и только) ошибку. 'binary '<<': оператор не найден, который принимает правый операнд типа« Оценка »(или нет приемлемого преобразования)' Как мой тест в main() не может найти подходящий перегрузка? (это не включает). –
Вы должны поместить объявление 'operator <<' right с определением вашего класса: то есть в том же заголовке и в том же пространстве имен. Таким образом, вы не забудете включить его, и вы, компилятор, сможете забрать его при поиске приемлемых перегрузок. –