답변:
친구는 클래스의 인터페이스를 확장하는 고전적인 방법입니다.
그러나 가장 좋은 점은 친구가 특정 항목을 수업에 단단히 묶으려는 의도를 명시 적으로 문서화한다는 것입니다.
참고 : 친구를 사용하면 친구를 수업에 단단히 묶을 수 있습니다.
완벽한 예는 C ++의 스트림 연산자입니다.
class Plop
{
private:
int value;
friend std::ostream& operator<<(std::ostream& stream, Plop const& data);
friend std::istream& operator>>(std::istream& stream, Plop& data);
};
std::ostream& operator<<(std::ostream& stream, Plop const& data)
{
return stream << data.value << " ";
}
std::istream& operator>>(std::istream& stream, Plop& data)
{
return stream >> data.value;
}
여기서는 객체를 스트림 안팎으로 스트리밍 할 수있는 방식으로 Plop 클래스의 퍼블릭 인터페이스를 확장하고 있지만 내부 구현을 노출하거나 향후 구현 두통을 유발하지 않으면 서 get / set 메소드를 사용해야합니다. 내부 구현이 변경 되어도 공용 인터페이스의 일부이므로 유지 관리됩니다.
참고 :이 않습니다 NOT 캡슐화를 중단하지만이 풍덩 클래스의 구현 (스트림 사업자의 구현에 대한 변경이 필요합니다 풍덩 클래스의 구현에 어떤 변화를 즉)에 단단히 스트림 사업자 바인딩을 수행합니다. 그러나 이것은 예상됩니다. 공개 인터페이스의 모든 부분 (공개 / 보호 된 메소드 포함)은 구현과 밀접하게 관련되어 있습니다.
그러나 참고 :이 바인딩을 클래스 선언의 일부로 명시 적으로 문서화했습니다.
참고 : 나는 개인 정보를 공개하는 선호하는 방법으로 친구를 언급하지 않을 것입니다. 친구의 과도한 사용은 구현을 노출하는 것만 큼 나쁠 수 있습니다. 모든 언어 기능과 마찬가지로 신중하게 사용해야합니다.
friend
선호 하는지 묻는다면 외부에서 개인 클래스 데이터에 액세스하기 위해 일반적으로 사용하는 다른 방법은 무엇입니까?