就在这里。
我一直在尝试提倡这种方法一段时间,基本思想是使用一个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
。然而,它的使用仅限于那些能够传递set_key
实例的人......并且只能方便地set
构建这样的对象。
请注意,set
实际上可能会将set_key
对象传递给它信任的其他人。它是传统意义上的钥匙:如果你把你公寓的钥匙交给某人,它可能会将它托付给另一个人。然而,由于关键类的语义(不可复制,只能set
构造和销毁它),这通常仅限于key
对象范围的持续时间。
请注意,邪恶的黑客攻击总是可能的,即*((set_key*)0)
. 这个方案可以保护墨菲,而不是马基雅维利(无论如何在 C++ 中是不可能的)。