我想创建一个类B类的朋友类。我想这样做,因为这些非常相互作用,A需要改变B类的内部(我不想使用public公开)。但我想确保它只能访问几个选定的函数而不是所有函数。
示例:
class A
{
};
class B
{
private:
void setState();
void setFlags();
friend class A
};
我希望A能够访问setState但不能访问setFlags ...是否有设计模式或这样做的好方法,或者我在这种情况下完全访问或完全没有访问权限。
由于
答案 0 :(得分:26)
这取决于你的意思“很好的方式”:)在comp.lang.c ++。版主我们前一段时间有同样的问题。您可能会看到它生成的讨论there。
IIRC,我们最终使用了“嵌套密钥的朋友”方法。应用于您的示例,这将产生:class A
{
};
class B
{
public:
class Key{
friend class A;
Key();
};
void setFlags(Key){setFlags();}
private:
void setState();
void setFlags();
};
这个想法是必须使用“Key”调用public setFlags(),并且只有Key的朋友可以创建一个,因为它的ctor是私有的。
答案 1 :(得分:7)
一种方法是通过显式接口,因为接口的实现者可以选择他们给谁:
class NearlyPrivateInterface {
public:
virtual void setState() = 0;
virtual void setFlags() = 0;
};
class A {
public:
void attach(NearlyPrivateInterface* instanceOfB);
};
class B: private NearlyPrivateInterface {
public:
void attach(A& a) { a.attach(this); }
};
答案 2 :(得分:2)
你可以做以下事情..
class A{
};
class B{
private:
void setFlags();
protected:
void setState();
};
class RestrictedB :public B{
friend class A;
};