有限访问的朋友类

时间:2009-10-22 19:34:11

标签: c++ design-patterns

我想创建一个类B类的朋友类。我想这样做,因为这些非常相互作用,A需要改变B类的内部(我不想使用public公开)。但我想确保它只能访问几个选定的函数而不是所有函数。

示例:

class A
{
};

class B
{
private:
 void setState();
void setFlags();
friend class A
};

我希望A能够访问setState但不能访问setFlags ...是否有设计模式或这样做的好方法,或者我在这种情况下完全访问或完全没有访问权限。

由于

3 个答案:

答案 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;
};