【问题标题】:Why can't I declare a friend in one class that is a private member of another class?为什么我不能在一个类中声明一个朋友是另一个类的私有成员?
【发布时间】:2010-07-21 19:57:41
【问题描述】:

给定以下代码:

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 不想使用另一个类的这个私有成员函数,而只是希望该函数能够访问它自己的私有成员。

如果只打算在WindowMgr 类中使用,将relocateScreen 函数公开可能是糟糕的设计。同样,将Screen 设为WindowMgr 的朋友可能是一个糟糕的设计,如果在其他情况下不打算访问WindowMgr 的私有成员。

我哪里错了?什么是正确的方法?我是在自欺欺人吗?

【问题讨论】:

    标签: c++ private friend member-functions


    【解决方案1】:

    朋友声明不起作用,因为WindowMgr::relocateScreen()WindowMgr 是私有的。

    C++ 标准 11.4-7:

    “朋友提名的名字 声明应在 包含的类的范围 朋友声明...”

    就我个人而言,我会将relocateScreen() 设为Screen 的私有成员函数,并将WindowMgr 设为friendScreen。这样一来,WindowMgr 就可以在Screen 上调用relocateScreen(),而不必接触Screen 的任何数据成员。

    【讨论】:

      【解决方案2】:

      WindowMgr 必须将 Screen 声明为好友。您可以使用前向声明。

      【讨论】:

      • 前向声明已经存在。事实上,如果我在 WindowMgr 中让 Screen 类成为朋友,那么 Screen 类的声明将被引入到周围的作用域中,从而显式地消除了对前向声明的需要。
      【解决方案3】:

      为什么不将 WindowMgr::relocateScreen 分解到不同的类中,比如带有 1 relocateScreen 函数的 WindowMgrFoo。 Delcare WindowMgrFoo 是 Screen in Screen 的朋友,让 WindowMgr 从 WindowMgrFoo 私下继承?或者只是让 WindowMgr 具有对 WindowMgrFoo 的引用,但是如果将其公开,则需要更改用户调用它的方式。

      【讨论】:

        【解决方案4】:

        In Silico - 引用标准的好方法。睡在上面后,我现在明白了原因:

        通过将WindowMgr::relocateScreen 及其参数列表声明为Screen 中的朋友,Screen 类将依赖于WindowMgr 类的私有实现。这违反了封装/信息隐藏。

        为了不违反 OOD 的原则,只有类的公共成员函数才能在另一个类中声明为友元,否则后者将依赖于前者的私有实现。

        【讨论】:

          猜你喜欢
          • 2015-11-24
          • 2018-08-23
          • 1970-01-01
          • 2012-05-19
          • 1970-01-01
          • 1970-01-01
          • 2021-08-29
          • 2015-07-02
          • 2012-06-07
          相关资源
          最近更新 更多