예 있습니다.
나는 잠시 동안 방법을 옹호하려고 노력 해왔다. 기본적인 생각은 Key
클래스를 사용하는 것이다.
실제로는 이이 아니지만 friend
을 사용하면 노출 된 구현 세부 정보가 줄어 듭니다.
class set;
// 1. Define the Key class
class set_key: noncopyable { friend class set; set_key() {} ~set_key() {} };
class set
{
// 2. Define the iterator
class iterator
{
public:
void public_method();
void restricted_method(set_key&);
}; // class iterator
}; // class set
이제 restricted_method
그래서 set
가 iterator
에 대한 특별한 접근을 필요로하지 않는다, public입니다. 그러나 그것의 사용은 set_key
인스턴스를 전달할 수있는 사람들로 제한되어 있으며 편리하게 set
만이 그러한 객체를 만들 수 있습니다.
실제로 set
은 신뢰하는 다른 사람에게 set_key
개체를 전달할 수 있습니다. 그것은 전통적인 의미의 열쇠입니다 : 누군가에게 평평한 열쇠를 주면 그것을 다른 사람에게 맡길 수 있습니다. 그러나 키 클래스의 의미 (복사 할 수 없기 때문에 set
만이이를 생성하고 파기 할 수 있습니다) 이것은 일반적으로 key
개체의 범위 지속 기간으로 제한됩니다.
악의적 인 해킹은 항상 가능합니다. 즉 *((set_key*)0)
입니다. 이 계획은 Machiavelli가 아닌 Murphy를 보호합니다 (C++에서는 불가능합니다).
왜 'friend' 선언을 사용하지 않으시겠습니까? – finnw
당신이 인용 부호로 "친구 클래스 집합"이라고 부르는 이유는 확실치 않습니다. 그냥 분명히하기 위해서, 당신은 당신을 괴롭히지 않는'public'과 똑같은 방법으로'friend'를 사용할 수 있습니다. –
이것은 정확히 'friend' 선언이 캡슐화를 향상시키는 경우와 같습니다. 명백한 대안은 캡슐화를 완전히 중단하기 때문입니다. – aschepler