Wpis z mikrobloga

#naukaprogramowania #cpp

Dlaczego mając ciało funkcji zaprzyjaźnionej poza deklaracją klasy nie mogę dostać się do składników prywatnych klasy, a jeśli jest jako inline to mam dostęp?

plik nagłówkowy:

friend std::ostream & operator<<(std::ostream & out, const Data & date)
{
out << date.day << "." << date.month << "." << date.year << std::endl;
}

tutaj mogę się odnieść bezpośrednio do prywatnych pól;

plik z definicją:

std::ostream & operator<<(std::ostream & out, const Data & date)
{
out << date.getDay() << "." << date.getMonth() << "." << date.getYear() << std::endl;
return out;
}

A tutaj muszę użyć getterów, bo inaczej nie dostanę się do prywatnych pól day, month, year.
Oczywiście jedno z ciał jest zakomentowane.
  • 5
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Sochu:
ten operator nie jest w mojej klasie tylko deklaruję z nim przyjaźń, dlatego nie daję tego zakresu wcześniej: NazwaKlasy::operator...
Co dokładnie nie działa:

Mając taką deklarację funkcji zaprzyjaźnionej w klasie
  • Odpowiedz
// header Data.h
class Data
{
int day, month, year;
public:
friend std::ostream & operator<<(std::ostream & out, const Data & date);
  • Odpowiedz
@Sochu: Spróbowałem teraz przerzucić #include do pliku nagłówkowego i wtedy działa, tzn mogę się odwołać do prywatnych pól.
Miałem się pytać dlaczego tak, ale chyba już rozumiem. Przy deklaracji tej funkcji zaprzyjaźnionej musi być już znana definicja (albo deklaracja?) ostream'a. Tak mi się wydaje, ale głowy sobie za to nie dam uciąć.

W main.cpp też mam #include więc to chyba jednak deklaracja jest, bo nie
  • Odpowiedz