Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ Overloading Extraction Operator - Error cannot access private member declared in class

I'm working on some homework and receiving the strangest error. Hoping you can help. I am getting this error:

Cannot access private member in class

Note: I am obviously not done writing this but I try to test for errors as I go. Thanks so much for any input you have!

// 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;
} 
like image 202
Amanda Brine Avatar asked Oct 07 '12 21:10

Amanda Brine


3 Answers

You want to pass and return the streams by reference: you can't copy IOStream objects. Also, in case of the write, you probably want to pass a SoccerPlayer const&. With these changes you code should compiler (although there is also an excess semicolon after the definition of the output operator).

That is, you output operator should be declared as

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

(both in its definition and the friend declaration).

like image 113
Dietmar Kühl Avatar answered Nov 10 '22 20:11

Dietmar Kühl


std::ostream is not copyable. You need to pass a reference, and return a reference:

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

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

Note also that there is no reason not to pass the SoccerPlayer as a const reference.

On a note completely unrelated to the error, you should prefer to use the constructor initialization list instead of assigning values to data members in the constructor body:

SoccerPlayer::SoccerPlayer(int jersey, int goal, int assist) 
: jerseyNum(jersey), numGoal(goal), numAssists(assist) {}
like image 2
juanchopanza Avatar answered Nov 10 '22 20:11

juanchopanza


You should send the reference of ostream object to your friend function. So it will be something like friend std::ostream& operator<<(std::ostream &, SoccerPlayer&); both in prototype as well as in definition.

like image 2
Recker Avatar answered Nov 10 '22 19:11

Recker