답변:
친구 수업에는 두 가지 주요 단점이 있습니다.
즉, 친구 클래스를 사용하면 캡슐화를 확실히 향상시킬 수 있습니다. 특히 대안이 공개 게터 / 세터 인 경우 더욱 그렇습니다.
또한 SO에 관한 관련 질문 : https : //.com/questions/521754/when-to-use-friend-class-in-c
캡슐화는 좋지만 문제의 분리는 더 좋습니다.
다른 클래스의 "일부 개인 부분"에 액세스하는 클래스는 코드가 처음에 제대로 설계되지 않았 음을 나타낼 수 있습니다.
당신이 "아쉬, 여기에 친구 수업을해야 해요"자리에서 당신을 발견 할 때마다, 당신이 스스로 물어봐야 할 질문은 "내가 이것을 올바르게하고 있습니까, 아니면 더 깨끗한 방법이 있습니까?"입니다. (일명 "이것이 나중에 엉덩이에 물 릴까요?").
"친근 함"에 대해 확신이 있으시면 망설이지 말고 그대로 두십시오.
또 다른 옵션은 PIMPL idiom 을 사용하는 것입니다 . 여기서 구조 구현의 일부는 다른 유형에 대한 포인터입니다. 클래스의 대부분의 사용자는 일반 헤더 파일 만 포함하며 구현은 불투명 포인터입니다. 개인 데이터에 액세스해야하는 클래스는 다른 유형을 정의하는 헤더를 포함하고 제공하는 인터페이스를 사용할 수 있습니다.
이것은 친구와 같은 기능을 원하는 C 프로그래머에게 공통적 인 패턴입니다. 제 생각에는 캡슐화 (관심 분리를 구현하는 데 유용하지만 종종 오용되는 OO 관련 기술)보다는 우려 분리 (일반적으로 재사용 가능한 직교 코드로 이어지는 일반적으로 좋은 설계 원칙) 에 대한 생각에 더 가깝습니다. 일을 너무 복잡하게 만듭니다).
그것은 친구보다 친구를 전혀 친구와 연결시키지 않는다는 장점이 있습니다. 어떤 사람들은 수업에 "친구"가 될 수 있기 때문에 이것이 단점이라고 주장 할 수도 있습니다. 나는 당신이 여전히 머리글을 포함하여 관계를 명시 적으로 만들고 있기 때문에 이것이 부당한 두려움이라고 생각합니다. 당신이 그것을 두려워한다면, 당신은 현명한 건축 결정을 내릴 수있는 (또는 동료의) 능력을 두려워합니다. 그러나 나중에 결정을 내릴 수 없다면 왜 friend
지금 자신을 신뢰하고 있습니까?
런타임 비용의 단점이 있습니다. 포인터에 데이터를 저장하면 캐시 일관성이 떨어지고 할당 횟수가 많아지며 정리할 소멸자가 필요합니다.