Search code examples
c++operator-overloadingprivate-membersostream

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;
} 

Solution

  • 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) {}