2012-10-07 1 views
5

일부 숙제로 가장 이상한 오류가 발생합니다. 당신이 도울 수 있으면 좋겠다. 이 오류가 무엇입니까 :C++ 오버로드 추출 연산자 - 클래스에서 선언 된 전용 멤버에 오류가 액세스 할 수 없습니다.

Cannot access private member in class

: 나는 분명히이 글을 쓰는하지 오전하지만 난 가서 오류를 테스트하려고합니다. 당신이 가지고있는 모든 입력에 대해 고마워요!

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

답변

2

std::ostream은 복사 할 수 없습니다. 또한 const 기준으로 SoccerPlayer을 통과하지 않을 이유가 없다는 것을

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

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

참고 : 당신은 참조를 전달하고, 참조를 반환해야합니다.

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

정말 감사합니다. 나는이 장을 읽는데 어려움을 겪고있다. 정말 감사한다. –

3

IOStream 개체를 복사 할 수 없으므로 스트림을 참조로 전달하고 반환해야합니다. 또한 쓰기의 경우 SoccerPlayer const&을 전달하려고합니다. 이러한 변경 사항을 사용하면 컴파일러가 코드를 작성해야합니다 (출력 연산자를 정의한 후에 초과 세미콜론도 있음). 인

이 경우 출력 연산자

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

(그 정의와 friend 선언 모두)으로 선언한다.

0

std::ostream operator<<(std::ostream player, SoccerPlayer& aPlayer)privateprotected 필드에 액세스하려면 클래스 또는 구성원의 친구 여야합니다.

+1

그것은 '친구'입니다. 문제는 스트림 객체에 누락 된 복사 생성자입니다 (정확한 오류가 무엇인지에 대한 질문이 언급 한 경우 도움이됩니다). –

+0

@ DietmarKühl : 나는 그 때 친구 분을 그리워했습니다. 비록 두 번 보았습니다. – JimR

2

당신은에 ostream에 객체의 참조를 보내야합니다 :

오류는 전혀 관련이 메모에

, 당신은 생성자 본문에 데이터 멤버에 값을 할당하는 대신 생성자 초기화 목록을 사용하는 것을 선호한다 당신의 친구 기능. 따라서 프로토 타입과 정의에 모두 friend std::ostream& operator<<(std::ostream &, SoccerPlayer&); 과 같은 형식이됩니다.

관련 문제