2012-10-07 29 views
5

Estoy trabajando en algunas tareas y estoy recibiendo el error más extraño. Esperando que puedas ayudar. Estoy consiguiendo este error:C++ Operador de extracción de sobrecarga - Error no puede acceder al miembro privado declarado en la clase

Cannot access private member in class

Nota: Obviamente no he terminado de escribir esto, pero yo trato de poner a prueba de errores como voy. ¡Muchas gracias por cualquier aporte que tengas!

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

Respuesta

2

std::ostream no se puede copiar. Que necesita para pasar una referencia, y devolver una referencia:

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

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

Tenga en cuenta también que no hay ninguna razón para no pasar el SoccerPlayer como referencia const.

En una nota nada que ver con el error, se debe preferir utilizar la lista de inicialización de constructores en lugar de asignar valores a los miembros de datos en el cuerpo del constructor:

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

Ya veo, ¡muchas gracias! Estoy teniendo dificultades con este capítulo, ¡realmente aprecio tu ayuda! –

3

Quiere pasar y volver a introducir las secuencias por referencia: no puede copiar los objetos IOStream. Además, en el caso de la escritura, es probable que desee pasar un SoccerPlayer const&. Con estos cambios, el código debe compilar (aunque también hay un exceso de punto y coma después de la definición del operador de salida).

Es decir, que el operador de salida debe declararse como

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

(tanto en su definición y la declaración friend).

0

std::ostream operator<<(std::ostream player, SoccerPlayer& aPlayer) tiene que ser un amigo de la clase o un miembro de la clase para acceder a los campos private y protected.

+1

Es _un_un "amigo". El problema es el constructor de copia faltante en los objetos de transmisión (hubiera sido útil si la pregunta hubiera mencionado cuál fue el error exacto). –

+0

@ DietmarKühl: Eché de menos la parte de amigo entonces. Aunque miré dos veces. – JimR

2

usted debe enviar la referencia del objeto ostream a tu función amiga Por lo tanto, será algo así como friend std::ostream& operator<<(std::ostream &, SoccerPlayer&); tanto en prototipo como en definición.

Cuestiones relacionadas