Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;,给定类a中的一个成员函数,我们是否可以将其访问权限限制为只访问类B,而不允许B完全访问a?_C++_Encapsulation - Fatal编程技术网

C++ 在C++;,给定类a中的一个成员函数,我们是否可以将其访问权限限制为只访问类B,而不允许B完全访问a?

C++ 在C++;,给定类a中的一个成员函数,我们是否可以将其访问权限限制为只访问类B,而不允许B完全访问a?,c++,encapsulation,C++,Encapsulation,可能重复: 我已经想了好几次了,但都没能想出一个像样的方法 假设我在类a中有一个成员函数,我希望能够从一个不相关的类B调用该函数,但通常不可调用。您可能会说,“当然,将函数私有化,并声明B是a的朋友。”这就是我一直在做的,但这似乎有点过分了。我真的不想让B访问A中的所有内容,只是一个函数 简而言之:A::func()只能由类B调用,但B不能声明为A的朋友。可能吗?您可以将A的接口拆分为几个纯抽象基类,然后对具有适当方法的接口进行引用。其他类将只获取不包含此方法的接口。请记住,这不是非常可伸缩的

可能重复:

我已经想了好几次了,但都没能想出一个像样的方法

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


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

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

一种可能的方法是创建一个受信任的类来包装
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++模板可以让你在不同的函数和类名中概括这一点(虽然我可能是错的),这意味着你将对每一个你想启用的函数和类元组重复这个。