成员函数(与整个类相对)可以与函数/类成为一个朋友吗?

时间:2015-11-06 13:21:12

标签: c++ friend

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

但有没有办法只允许F访问C的特定成员函数,而不允许F访问整个类?

This是我想要这样做的原因。

2 个答案:

答案 0 :(得分:5)

不,你不能。

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

答案 1 :(得分:4)

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

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
}

我们的想法是只允许那些可以构造functionToAccess对象的人调用C::AccessTag。由于它的私有构造函数,C::AccessTag只能由其朋友构建。这些是C(因此它可以调用functionToAccess本身,因为它可以调用其任何其他私有函数)和FF无法访问C的任何其他非公开成员,因为它不是C的朋友。

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