【问题标题】:In C++, given a member function in class A, can we restrict its access to only class B, without giving B complete friend access to A? [duplicate]在 C++ 中,给定类 A 中的一个成员函数,我们是否可以限制它只访问类 B,而不给 B 对 A 的完全朋友访问权限? [复制]
【发布时间】:2023-09-21 18:59:01
【问题描述】:

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

我已经想了好几次了,但一直没能想出一个体面的方法来做到这一点。

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

简而言之:A::func() 只能由 B 类调用,但 B 没有声明为 A 的朋友。可能吗?

【问题讨论】:

标签: c++ encapsulation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    一种可能的方法是创建一个包装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);
    }
    

    【讨论】:

    • 这是一个非常重量级的解决方案,特别是如果您需要在多个地方执行此操作。另外,我不认为 C++ 模板可以为您提供任何方法来将其概括为不同的函数和类名(尽管我可能是错的),这意味着您将对要启用的每个函数和类元组重复此操作.
    最近更新 更多