![](/img/trans.png)
[英]Why can't a PRIVATE member function be a friend function of another class?
[英]Why can't I declare a friend in one class that is a private member of another class?
给出以下代码:
class Screen;
class WindowMgr
{
WindowMgr& relocateScreen( int r, int c, Screen& s);
};
class Screen
{
friend WindowMgr& WindowMgr::relocateScreen( int r, int c, Screen& s);
// ^ cannot access private member declared in class 'WindowMgr'
int m_nR,
m_nC;
};
WindowMgr& WindowMgr::relocateScreen( int r, int c, Screen& s)
{
s.m_nR = r;
s.m_nC = c;
return *this;
}
为什么Screen
类不能将WindowMgr::relocateScreen
成员函数声明为朋友? Screen
不想使用另一个类的私有成员函数,而只是希望该函数能够访问自己的私有成员。
使得relocateScreen
,如果是只用在内部使用功能的公共可能是糟糕的设计WindowMgr
类。 同样,如果WindowMgr
在任何其他情况下访问WindowMgr
私有成员, WindowMgr
使Screen
成为WindowMgr
的朋友可能是糟糕的设计。
我在哪里错了? 什么是正确的方法? 我自欺欺人了吗?
友元声明不起作用,因为WindowMgr::relocateScreen()
是WindowMgr
。
C ++标准11.4-7:
“朋友声明提名的名称应在包含朋友声明的类别范围内可访问......”
就个人而言,我会将WindowMgr
relocateScreen()
作为Screen
的私有成员函数,并使WindowMgr
成为Screen
的friend
。 这样, WindowMgr
只能在Screen
上调用WindowMgr
relocateScreen()
,而不必触及Screen
任何数据成员。
WindowMgr必须将Screen声明为朋友。 您可以使用前向声明。
为什么不将WindowMgr :: relocateScreen分解为另一个类,比如说WindowMgrFoo和1 relocateScreen函数。 Delcare WindowMgrFoo是Screen in Screen的朋友,WindowMgr是否从WindowMgrFoo私下继承? 或者只是让WindowMgr具有对WindowMgrFoo的引用,但是如果将其公开,则需要更改用户调用它的方式。
在Silico - 很好的引用标准。 睡了之后我现在看到理由:
通过声明WindowMgr::relocateScreen
及其参数列表成为Screen
的朋友, Screen
类变得依赖于WindowMgr
类的私有实现。 这违反了封装/信息隐藏。
为了不违反OOD的原则,只有类的公共成员函数可以在另一个中声明为朋友,否则后者变得依赖于前者的私有实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.