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

时间:2010-07-19 16:02:07

标签: c++ encapsulation

  

可能重复:
  clean C++ granular friend equivalent? (Answer: Attorney-Client Idiom)

我想要这几次,并且无法想出一个像样的方法。

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

简而言之:A::func()只能由B级调用,但B未被宣布为A的朋友。可能吗?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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);
}