Pomysł utworzenia x::xx
private
powinien być taki, że x::xx
jest szczegółem implementacji, na który inne klasy nie powinny polegać. Nie oznacza to tylko, że x::xx
nie może być wywołany przez inne klasy, to znaczy, a raczej powinno to oznaczać, że np. zmiana nazwy na x::xx
na x::xy
nie powinna przerwać niczego poza samą klasą i przyjaciółmi klasy.
W twoim przypadku, zmiana nazwy x::xx
do x::xy
spowodowałoby klasę y
wystąpienie błędu, mimo że nie jest przyjacielem x
.
Sposobem na uniknięcie to zrobić y
przyjacielem x
, dzięki czemu można uzyskać dostęp x
y
„s private
członków. Następnie może zadeklarować x::xx
jako friend
.
(Uwaga: bardziej bezpośrednia odpowiedź na pytanie "Dlaczego kompilator nie pozwala na to?" To "Ponieważ standard na to nie pozwala.", Co naturalnie prowadzi do następującego pytania: "Dlaczego standard nie pozwalają na to? ". Próbuję odpowiedzieć na to kolejne pytanie.)
możliwy duplikat [Deklaracja przyjaciela w C++ - różnica między publicznym a prywatnym] (http://stackoverflow.com/questions/6407691/ friend-declaration-in-c-difference-between-public-and-private) – ha9u63ar
@ hagubear Zdecydowanie nie jest to duplikat tego. – hvd
Pytasz, dlaczego język na to nie pozwala? W pewnym momencie ktoś pomyślał (co zrozumiałe), że to zły pomysł. – juanchopanza