Оператор извлечения C ++ с перегрузкой — ошибка не может получить доступ к закрытому члену, объявленному в классе

Я работаю над домашней работой и получаю странную ошибку. Надеюсь, вы можете помочь. Я получаю эту ошибку:

Невозможно получить доступ к приватному члену в классе

ЗаметкаЯ, очевидно, еще не закончил писать это, но я стараюсь проверять ошибки на ходу. Большое спасибо за любой вклад, который у вас есть!

// Amanda
// SoccerPlayer.cpp : main project file.
// October 6, 2012
/* a. Design a SoccerPlayer class that includes three integer fields: a player's jersey     number,
number of goals, and number of assists. Overload extraction and insertion operators for     the class.
b. Include an operation>() function for the class. One SoccerPlayer is considered greater
than another if the sum of goals plus assists is greater.
c. Create an array of 11 SoccerPlayers, then use the > operator to find the player who   has the
greatest goals plus assists.*/

#include "stdafx.h"#include<conio.h>
#include<iostream>
#include<string>class SoccerPlayer
{
friend std::ostream operator<<(std::ostream, SoccerPlayer&);
//  friend std::istream operator>>(std::istream, SoccerPlayer&);
private:
int jerseyNum;
int numGoals;
int numAssists;
public:
SoccerPlayer(int, int, int);

};

SoccerPlayer::SoccerPlayer(int jersey, int goal, int assist)
{
jerseyNum = jersey;
numGoals = goal;
numAssists = assist;
}

std::ostream operator<<(std::ostream player,  SoccerPlayer& aPlayer)
{
player << "Jersey #" << aPlayer.jerseyNum <<
" Number of Goals " << aPlayer.numGoals <<
" Number of Assists " << aPlayer.numAssists;
return player ;
};

int main()
{
return 0;
}

5

Решение

std::ostream не копируется Вам нужно передать ссылку и вернуть ссылку:

friend std::ostream& operator<<(std::ostream&, const SoccerPlayer&);

....
std::ostream& operator<<(std::ostream& player,  const SoccerPlayer& aPlayer) { /* as before */ }

Также обратите внимание, что нет причин не сдавать SoccerPlayer как const ссылка.

В заметке, совершенно не связанной с ошибкой, вы должны предпочесть использовать список инициализации конструктора, а не присваивать значения элементам данных в теле конструктора:

SoccerPlayer::SoccerPlayer(int jersey, int goal, int assist)
: jerseyNum(jersey), numGoal(goal), numAssists(assist) {}
2

Другие решения

Вы хотите передавать и возвращать потоки по ссылке: вы не можете копировать объекты IOStream. Кроме того, в случае записи, вы, вероятно, хотите передать SoccerPlayer const&, С этими изменениями вы должны кодировать компилятор (хотя после определения оператора вывода также есть лишняя точка с запятой).

То есть ваш оператор вывода должен быть объявлен как

std::ostream& operator<< (std::ostream&, SockerPlayer const&)

(как в своем определении, так и friend декларация).

3

Вы должны отправить ссылку на объект ostream вашей функции друга.
Так будет что то вроде friend std::ostream& operator<<(std::ostream &, SoccerPlayer&);
как в прототипе, так и в определении.

2

std::ostream operator<<(std::ostream player, SoccerPlayer& aPlayer) должен быть другом класса или членом класса, чтобы получить доступ private а также protected поля.

0
По вопросам рекламы [email protected]