繁体   English   中英

为什么我不能在一个属于另一个类的私有成员的类中声明一个朋友?

[英]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成为Screenfriend 这样, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM