Friend scope w C++

Jeśli mam trzy klasy, A, B, C. A i B są przyjaciółmi (dwukierunkowo). Ponadto B I C są przyjaciółmi (dwukierunkowo). A ma wskaźnik do B, A B ma wskaźnik do C. dlaczego A nie może uzyskać dostępu do prywatnych danych C przez wskaźnik?

Dla wyjaśnienia: jest to czysto teoretyczne pytanie w języku C++, a nie pytanie o porady projektowe.

 16
Author: Marcin, 2009-01-13

5 answers

Przyjaźń w C++ nie jest przechodnia:

John jest moim przyjacielem i może korzystać z mojego połączenia bezprzewodowego w każdej chwili (ufam mu).
Przyjaciel Johna Tim jest marnotrawcą i chociaż John jest moim przyjacielem, nie włączam Tima jako przyjaciela, a zatem nie pozwalam mu korzystać z mojego połączenia bezprzewodowego.

Przyjaźń nie jest dziedziczona

Również dzieci Johna to banda chuliganów, więc nie ufam im ani na pewno nie są moimi przyjaciółmi, ani moimi własnymi dziećmi, którym ufam jako tak daleko, jak mogłem je rzucić. Chociaż nasze dzieci nie mają bezpośredniego dostępu do sieci bezprzewodowej, mogą uzyskać do niej dostęp, jeśli przejdą przez nas. Tak więc dzieci Johna mogą uzyskać dostęp do mojej sieci bezprzewodowej, jeśli uzyskają do niej dostęp przez Johna (tj. są nadzorowane i chronione przez Johna).

Również przyjaźń nie jest symetryczna.

John ma pracę rządową, więc niestety nie może nikomu ufać, zwłaszcza jeśli chodzi o łączność bezprzewodową.

You are always your own best przyjaciel.

Pozwala to na takie rzeczy, jak konstruktory kopiujące, gdzie można uzyskać dostęp do prywatnego członka innego obiektu, nawet jeśli nie ma rzeczywistego dostępu.

Więc automatycznie zaprzyjaźniam się ze wszystkimi moimi klonami : -) ponieważ są to tylko inne instancje mnie.

 130
Author: Martin York,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-22 10:44:23

Przyjaźń w C++ nie jest przechodnia:

(A is friend of B) and (B is friend of C) does not mean (A is friend of C)
Również przyjaźń nie jest symetryczna.
(A is friend of B) does not mean (B is friend of A) 

Musisz wyraźnie stwierdzić, że A jest przyjacielem C, aby mieć dostęp do prywatnych rzeczy C z poziomu A. Jeśli dodanie settera i gettera do klasy ujawnia informacje, które nie mają być ujawnione, powinieneś rozważyć friends, jeśli nie możesz znaleźć wadliwego projektu (użycie friend jest poprawne. To nie jest znak na zły projekt). Jeśli można dodać setter i getter bez tego destrukcyjne dla interfejsu, a następnie należy unikać podejmowania znajomych innych klas. Zauważ, że Klasa zagnieżdżona jest zawsze przyjacielem klasy zagnieżdżonej. Tak więc Klasa zagnieżdżona może zobaczyć szeregi klasy zagnieżdżonej.

 24
Author: Johannes Schaub - litb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-12 22:39:11

Właśnie znalazłem ten artykuł czekając na odpowiedzi. Bardzo dobrze odpowiada na moje pytanie: Friend scope in C++

 3
Author: Marcin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-12 22:29:31

Ponieważ w C++ przyjaźń nie jest właściwością przechodnią. W rzeczywistości należy go unikać, gdy tylko jest to możliwe, ponieważ wprowadza złożoność w systemie.

Wyobraź sobie, że B jest klasą mediatora, A A I C są komponentami, którymi trzeba zarządzać, czy naprawdę uważasz, że ma sens, aby przycisk potrzebował dostępu do implementacji checkboxa?

Swoją drogą, nie widzę, gdzie jest "hierarchia" twojego tytułu w przypadku, gdy pytasz.

 3
Author: Luis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-12 22:30:57

To wszystko jest dobrze podsumowane-tutaj:

What does it mean that "friendship isn't inherited, transitive, or reciprocal"?

-->

Oznacza to, że klasy wywodzące się od klasy przyjaciół nie automatycznie stają się przyjaciółmi (czy ufasz dzieciom swoich przyjaciół?), przyjaciel przyjaciela nie staje się automatycznie przyjacielem (czy zaufać przyjaciołom swoich przyjaciół?), oraz że Klasa deklarująca inna klasa jako "przyjaciel" nie staje się automatycznie przyjacielem tej klasy (czy ufasz każdemu, kto nazywa cię a przyjaciel?).

Od

Http://yosefk.com/c++FQA / friend. html#fqa-14.4

 2
Author: octoback,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-06 10:21:45