Zazwyczaj w C ++ szybkość tworzenia gier jest ceniona nad enkapsulacją, dlatego widzimy masę publicznie dostępnych członków klasy, którzy tak naprawdę nie powinni być publiczni.
Wydaje mi się, że w większości przypadków tylko kilka bardzo wybranych klauzul naprawdę musi znać wewnętrzne działanie innych klas do tego stopnia, że modyfikuje lub odczytuje ich prywatne dane.
Tworzenie publicznych programów pobierających / ustawiających dla tych prywatnych danych ujawnia rzeczy, których tak naprawdę nie należy modyfikować bezmyślnie.
Czy kompromisem byłoby tutaj wykorzystanie klas przyjaciół? czy jest jakaś wada w stosunku do klas znajomych, których nie widzę.
źródło
Inną opcją jest użycie idiomu PIMPL , w którym częścią implementacji struktury jest wskaźnik do innego typu. Większość użytkowników klasy po prostu dołącza zwykły plik nagłówka, w którym implementacja jest nieprzezroczystym wskaźnikiem. Klasy, które potrzebują dostępu do danych prywatnych, mogą zawierać nagłówek określający inny typ i korzystać z interfejsu, który udostępnia.
Jest to powszechny wzorzec dla programistów C chcących funkcji podobnych do znajomych. Moim zdaniem bardziej skupia się na myśleniu o oddzieleniu problemów (ogólnie dobra zasada projektowania, która prowadzi do wielokrotnego użytku, ortogonalnego kodu) zamiast enkapsulacji (technika specyficzna dla OO, która jest przydatna do implementacji separacji problemów, ale także często nadużywana nadmiernie komplikować rzeczy).
Ma tę przewagę nad przyjacielem, że w ogóle nie łączy przyjaciela z przyjacielem. Niektórzy ludzie mogą twierdzić, że jest to wada, ponieważ teraz każdy może „zaprzyjaźnić się” z twoją klasą. Myślę, że to nieuzasadniony strach, ponieważ nadal wyraźnie określasz związek (włączając nagłówek). Jeśli się tego obawiasz, boisz się swojej (lub współpracownika) zdolności do podejmowania mądrych decyzji architektonicznych. Ale jeśli później nie możesz właściwie podjąć tych decyzji, to czemu ufasz
friend
teraz?Ma to wadę kosztu działania. Przechowując dane we wskaźniku, masz gorszą spójność pamięci podręcznej i większą liczbę alokacji, a także potrzebujesz niszczyciela, aby je wyczyścić.
źródło