一个成员函数(相对于整个类)是否可以与一个函数/类成为朋友

Can a member function (as opposed to the entire class) befriend a function/class?

本文关键字:函数 一个 朋友 成员 相对于 是否      更新时间:2023-10-16

函数F可以被声明为类C的朋友,这样它就可以访问整个类的私有和受保护成员。

但是有没有一种方法可以允许F只访问C的特定成员函数,而不是允许F访问整个类?

这就是我想这么做的原因。

不,你不能。

一种解决方法是将特定的成员函数放在一个单独的类C2中,C从中继承,并建立与C2的友谊。

没有办法直接用友谊来做到这一点,但你可以通过修改基于标签的调度来实现类似的效果:

class C
{
public:
  class AccessTag
  {
    friend class C;
    friend void F();
  private:
    AccessTag() {}
  };
  void functionToAccess(AccessTag)
  {
    std::cout << "Restricted function called!n";
  }
};
void F()
{
  C c;
  c.functionToAccess(C::AccessTag()); // OK
}
void nonF()
{
  C c;
  c.functionToAccess(C::AccessTag()); // error, nonF cannot access ctor of C::AccesTag
}

其思想是只允许那些能够构造C::AccessTag对象的人调用functionToAccess。由于C::AccessTag是私有的构造函数,它只能由它的朋友来构造。它们是C(这样它就可以调用functionToAccess本身,就像调用它的任何其他私有函数一样)和FF不能访问C的任何其他非公共成员,因为它不是C的朋友。

您甚至可以为不同的成员函数(或成员函数组)使用不同的访问标记。

相关文章: