2012-10-07 26 views
5

Tôi đang làm một số bài tập về nhà và nhận được lỗi lạ nhất. Hy vọng bạn có thể giúp đỡ. Tôi nhận được lỗi này:Toán tử khai thác quá tải C++ - Lỗi không thể truy cập thành viên riêng được khai báo trong lớp

Cannot access private member in class

Note: Tôi rõ ràng là không được thực hiện bằng văn bản này, nhưng tôi cố gắng để kiểm tra lỗi như tôi đi. Cảm ơn rất nhiều cho bất kỳ đầu vào bạn 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; 
} 

Trả lời

2

std::ostream không thể sao chép được. Bạn cần phải vượt qua một tài liệu tham khảo, và trả về một tài liệu tham khảo:

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

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

Cũng lưu ý rằng không có lý do để không vượt qua SoccerPlayer như một tài liệu tham khảo const.

Trên một lưu ý hoàn toàn không liên quan đến lỗi này, bạn nên thích sử dụng danh sách constructor khởi tạo thay vì gán giá trị cho các thành viên dữ liệu trong cơ thể constructor:

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

Tôi thấy, cảm ơn rất nhiều! Tôi đang gặp khó khăn với chương này, tôi thực sự đánh giá cao sự giúp đỡ của bạn! –

3

Bạn muốn chuyển và trả về luồng theo tham chiếu: bạn không thể sao chép đối tượng IOStream. Ngoài ra, trong trường hợp viết, bạn có thể muốn vượt qua một SoccerPlayer const&. Với những thay đổi bạn mã nên biên dịch (mặc dù cũng có một dấu chấm phẩy dư thừa sau khi định nghĩa của nhà điều hành đầu ra).

Đó là, bạn điều hành sản lượng nên được khai báo là

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

(cả trong định nghĩa của nó và friend khai).

0

std::ostream operator<<(std::ostream player, SoccerPlayer& aPlayer) phải là bạn của lớp học hoặc thành viên lớp học để truy cập các trường privateprotected.

+1

Nó _is_ một 'người bạn'. Vấn đề là thiếu bản sao xây dựng trên các đối tượng dòng (nó sẽ có ích nếu câu hỏi đã đề cập đến những gì các lỗi chính xác là). –

+0

@ DietmarKühl: Tôi hoàn toàn bỏ lỡ phần bạn bè sau đó. Mặc dù tôi nhìn hai lần. – JimR

2

Bạn nên gửi tài liệu tham khảo đối tượng ostream để chức năng bạn bè của bạn. Vì vậy, nó sẽ là một cái gì đó giống như friend std::ostream& operator<<(std::ostream &, SoccerPlayer&); cả trong nguyên mẫu cũng như trong định nghĩa.