[英]Why can't a PRIVATE member function be a friend function of another class?
class x
{
void xx() {}
};
class y
{
friend void x::xx();
};
这会导致错误
错误:朋友函数'xx'是'x'的私有成员
为什么我不能声明私有成员函数成为另一个类的朋友?
使x::xx
private
的想法应该是x::xx
是其他类不应该依赖的实现细节。 它并不仅仅意味着x::xx
不能被其他类调用,它意味着,或者更确切地说它应该意味着,例如将x::xx
重命名为x::xy
不应该破坏除类本身之外的任何其他类,和班上的朋友们。
在您的情况下,将x::xx
重命名为x::xy
会导致类y
出错,即使它不是x
的朋友。
避免这种情况的一种方法是使y
成为x
的朋友,以便y
可以访问x
的private
成员。 然后它可以将x::xx
声明为friend
。
(注意:对“为什么编译器不允许这个?”这一问题的更直接的回答是“因为标准不允许这样做。”这自然会导致后续问题“为什么标准不允许这样? “我正试图回答这个后续问题。)
朋友声明提名的名称应在包含朋友声明的类的范围内访问。
原因很简单; private
成员应遵守明确的规则:
一个班级的成员可以
private
也就是说,它的名称只能由声明它的类的成员和朋友使用。
允许在不相关的类中的声明中命名私有成员将违反此规则:它允许另一个类依赖于实现细节而不明确允许。 例如,当更改私有成员的名称,类型或签名或完全删除它时,这就成了问题; 这是为了不破坏该类的接口。
这可以通过整体规避x
的朋友y
:
class x {
void xx() {}
};
class y {
friend x;
};
演示 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.