2012-10-07 27 views
5

में घोषित निजी सदस्य तक नहीं पहुंच पा रहा है मैं कुछ होमवर्क पर काम कर रहा हूं और अजीब त्रुटि प्राप्त कर रहा हूं। उम्मीद है कि आप मदद कर सकते हैं। मैं इस त्रुटि हो रही है:सी ++ ओवरलोडिंग एक्सट्रैक्शन ऑपरेटर - त्रुटि

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 कॉपी करने योग्य नहीं है।

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

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

यह भी ध्यान रखें SoccerPlayer एक const संदर्भ के रूप में पारित करने के लिए नहीं कोई कारण नहीं है कि वहाँ: आप एक संदर्भ गुजरती हैं, और एक संदर्भ लौटना ही होगा।

एक नोट पूरी तरह से त्रुटि से संबंधित नहीं पर, आप के बजाय निर्माता प्रारंभ सूची का उपयोग करने के निर्माता शरीर में डेटा के सदस्यों को मान निर्दिष्ट की पसंद करते हैं चाहिए:

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)private और protected फ़ील्ड तक पहुंचने के लिए कक्षा या कक्षा के सदस्य का मित्र होना है।

+1

यह _is_ a 'friend' है। समस्या स्ट्रीम ऑब्जेक्ट्स पर लापता प्रतिलिपि निर्माता है (यदि प्रश्न का उल्लेख किया गया था कि सटीक त्रुटि क्या थी तो यह सहायक होगा)। –

+0

@ डाइटमार कुहल: मैं पूरी तरह से दोस्त के हिस्से को याद करता हूं। भले ही मैंने दो बार देखा। – JimR

2

आप को ostream वस्तु के संदर्भ भेजना चाहिए आपका दोस्त काम करता है। तो यह प्रोटोटाइप के साथ-साथ परिभाषा में friend std::ostream& operator<<(std::ostream &, SoccerPlayer&); दोनों की तरह कुछ होगा।

संबंधित मुद्दे