访问受限的朋友班级

问题描述 投票:0回答:3

我想让 A 类成为 B 类的朋友。我想这样做,因为它们之间的交互非常频繁,并且 A 需要更改 B 类的内部结构(我不想使用 public 来公开)。但我想确保它只能访问少数选定的功能,而不是所有功能。

示例:

class A
{
};

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

我希望 A 能够访问

setState
,但不能访问
setFlags
...是否有设计模式或好的方法来做到这一点,或者在这种情况下我是否只能提供完全访问权限或根本没有访问权限?

c++ design-patterns private friend
3个回答
29
投票

这取决于你所说的“一个好方法”是什么意思:) 在 comp.lang.c++.moderated 我们不久前也遇到了同样的问题。您可能会在there看到它生成的讨论。

IIRC,我们最终使用了“嵌套键的友元”方法。应用于您的示例,这将产生:

class A
{
};

class B
{
public:
     class Key{
         friend class A;
         Key();
     };

    void setFlags(Key){setFlags();}         

private:
  void setState();
  void setFlags();
};

这个想法是公共 setFlags() 必须使用“Key”来调用,并且只有 Key 的朋友才能创建一个,因为它的 ctor 是私有的。


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); }
};

1
投票

你可以做以下事情..

class A{
};

class B{
private: 
    void setFlags();
protected:
    void setState();

}; 

class RestrictedB :public B{  
    friend class A;
};
© www.soinside.com 2019 - 2024. All rights reserved.