昔、まさにこのウェブサイトで、私は を使ったスキームを提示しましたKey
。インターフェイスのどの部分がパブリックにアクセス可能で、どの部分がキーを必要とするかをメイン クラスが文書化し、キーを必要とする人にそのキーへのフレンドシップを付与するという考え方です。
class Key { friend class Stranger; Key() {} ~Key() {} };
class Item {
public:
void everyone();
void restricted(Key);
private:
};
現在、ここに示されているように、メソッドのみStranger
を使用できます。restricted
class Stranger {
public:
void test(Item& i) {
Key k;
i.restricted(k);
}
Key key() { return Key(); }
Key _key;
};
class Other {
void test(Item& i) {
Stranger s;
i.restricted(s.key()); // error: ‘Key::~Key()’ is private
// error: within this context
}
void test2(Item& i) {
Stranger s;
i.restricted(s._key); // error: ‘Key::~Key()’ is private
// error: within this context
// error: initializing argument 1 of ‘void Item::restricted(Key)’
}
};
これは非常に単純なスキームであり、完全な友情よりもはるかにきめ細かいアプローチを可能にします。