成员函数(与整个 class 相对)可以成为 function/class 的朋友吗?
Can a member function (as opposed to the entire class) befriend a function/class?
函数 F 可以声明为 class C 的友元,这样它就可以访问整个 class.
的私有和受保护成员
但是有没有办法只允许 F 访问 C 的特定成员函数,而不是允许 F 访问整个 class?
This就是我想做的原因
不,你不能。
一个解决方法是将该特定成员函数放在一个单独的 class C2 中,C 从中继承,并与 C2 建立友谊。
没有办法直接用friendship做这个,但是你可以通过修改tag-based dispatching达到类似的效果:
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
本身,就像它可以调用它的任何其他私有函数一样)和 F
。 F
无法访问 C
的任何其他非 public 成员,因为它不是 C
.
的朋友
您甚至可以为不同的成员函数(或成员函数组)设置不同的访问标签。
函数 F 可以声明为 class C 的友元,这样它就可以访问整个 class.
的私有和受保护成员但是有没有办法只允许 F 访问 C 的特定成员函数,而不是允许 F 访问整个 class?
This就是我想做的原因
不,你不能。
一个解决方法是将该特定成员函数放在一个单独的 class C2 中,C 从中继承,并与 C2 建立友谊。
没有办法直接用friendship做这个,但是你可以通过修改tag-based dispatching达到类似的效果:
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
本身,就像它可以调用它的任何其他私有函数一样)和 F
。 F
无法访问 C
的任何其他非 public 成员,因为它不是 C
.
您甚至可以为不同的成员函数(或成员函数组)设置不同的访问标签。