2012-10-07 13 views
5

Pracuję nad niektórymi zadaniami domowymi i otrzymuję najdziwniejszy błąd. Mam nadzieję, że możesz pomóc. Otrzymuję ten błąd:C++ Przeciążanie operatora wyodrębniania - Błąd nie może uzyskać dostępu do elementu prywatnego zadeklarowanego w klasie

Cannot access private member in class

Uwaga: Nie jestem oczywiście zrobić pisząc to, ale staram się testować pod kątem błędów jak idę. Dziękuję bardzo za wszelkie dane wejściowe!

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

Odpowiedz

2

std::ostream nie można kopiować. Trzeba przekazać odwołanie i zwrócić odwołanie:

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

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

Należy również zauważyć, że nie ma powodu, aby nie zdać SoccerPlayer jako const odniesienia.

Na marginesie zupełnie niezwiązanej z błędem, należy wolą korzystać z listy inicjalizacji konstruktor zamiast przypisywania wartości do członków danych w ciele konstruktora:

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

Widzę, dziękuję bardzo! Ciężko mi z tym rozdziałem, naprawdę doceniam twoją pomoc! –

3

Chcesz przekazać i zwrócić strumienie przez odwołanie: nie można kopiować obiektów IOStream. Ponadto, w przypadku zapisu, prawdopodobnie chcesz przekazać SoccerPlayer const&. Przy tych zmianach kod powinien być kompilatorem (chociaż po definicji operatora wyjściowego występuje również nadmiar średnika).

Oznacza to, że operator wyjście powinno zostać uznane jako

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

(zarówno w jego definicji i deklaracja friend).

0

std::ostream operator<<(std::ostream player, SoccerPlayer& aPlayer) musi być przyjacielem klasy lub członkiem klasy, aby uzyskać dostęp do pól private i protected.

+1

To jest "przyjaciel". Problemem jest brakujący konstruktor kopiowania na obiektach strumieniowych (pomocne byłoby, gdyby pytanie wspomniało o dokładnym błędzie). –

+0

@ DietmarKühl: Całkowicie przegapiłem część przyjaciela. Chociaż wyglądałem dwa razy. – JimR

2

należy przesłać referencję obiektu ostream do twoja funkcja przyjaciela. Tak więc będzie to coś w rodzaju prototypu, jak i definicji.

Powiązane problemy