“friend”키워드는 무엇을 위해 사용됩니까?


11

friend클래스의 개인 데이터에 대한 액세스 권한을 부여하기 위해 키워드가 선호되는 이유를 설명해 주 시겠습니까?


1
friend선호 하는지 묻는다면 외부에서 개인 클래스 데이터에 액세스하기 위해 일반적으로 사용하는 다른 방법은 무엇입니까?
벤자민 바니에

@honk "선호"는 여기서 사용하기에 잘못된 단어 일 수 있습니다. 문법과 기타 사항을 수정하기 위해 대부분의 게시물을 편집했으며 원래 단어 선택을 유지했지만 언어 장벽이있을 수 있습니다.
Adam Lear

나는 오늘 우연히 친구에 대해 읽었 기 때문에 모른다. 그리고 기사는 친구를 사용하지 않으면 monolit 클래스를 만들 것이라고 말합니다.
Dalton

답변:


17

친구는 클래스의 인터페이스를 확장하는 고전적인 방법입니다.
그러나 가장 좋은 점은 친구가 특정 항목을 수업에 단단히 묶으려는 의도를 명시 적으로 문서화한다는 것입니다.

참고 : 친구를 사용하면 친구를 수업에 단단히 묶을 수 있습니다.

완벽한 예는 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 캡슐화를 중단하지만이 풍덩 클래스의 구현 (스트림 사업자의 구현에 대한 변경이 필요합니다 풍덩 클래스의 구현에 어떤 변화를 즉)에 단단히 스트림 사업자 바인딩을 수행합니다. 그러나 이것은 예상됩니다. 공개 인터페이스의 모든 부분 (공개 / 보호 된 메소드 포함)은 구현과 밀접하게 관련되어 있습니다.

그러나 참고 :이 바인딩을 클래스 선언의 일부로 명시 적으로 문서화했습니다.

참고 : 나는 개인 정보를 공개하는 선호하는 방법으로 친구를 언급하지 않을 것입니다. 친구의 과도한 사용은 구현을 노출하는 것만 큼 나쁠 수 있습니다. 모든 언어 기능과 마찬가지로 신중하게 사용해야합니다.


게터를 통해 데이터에 공개적으로 액세스 할 수 있다면 대신 무료 기능을 사용 했습니까?
Ioanna
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.