在C++中,给定A类中的成员函数,我们是否可以将其访问权限仅限于B类,而不允许B完全朋友访问A?

Kur*_*son 8 c++ encapsulation

可能重复:
干净的C++粒度朋友等价?(答案:律师 - 客户成语)

我想要这几次,并且无法想出一个体面的方法来做到这一点.

假设我在A类中有一个成员函数.我希望能够从一个不相关的B类调用该函数,但通常不能调用.您可能会说,"当然,将该功能设为私有,并宣布B为A的朋友." 这就是我一直在做的事情,但似乎有点矫枉过正.我真的不想让B访问A中的所有内容,只需要一个函数.

简而言之:A::func()只能由B级调用,但B不是A的朋友.可能吗?

Bjö*_*lex 5

您可以将接口拆分A为几个纯抽象基类,然后提供B对具有适当方法的接口的引用.其他类只会获得不包含此方法的接口.请记住,这不是很可扩展,因为接口的数量很快就会变得非常大.


cas*_*nca 5

一种可能的方法是创建一个包装A::func并传递包装器对象的可信类B.这又需要包装器成为朋友A,但是你只需要管理一个这样的类,而所有外部类都可以使用包装器.

例:

class Wrapper;

class A {
  private:
    void func();
    /* other methods */

  public:
    Wrapper getWrapper();

    friend class Wrapper;
};

class Wrapper {
  private:
    A &ref;

  private:
    Wrapper(A &obj) : ref(obj) { }

  public:
    void func() {
      ref.func();
    }

  friend class A;
};

Wrapper A::getWrapper() {
  return Wrapper(*this);
}
Run Code Online (Sandbox Code Playgroud)