2010-07-21 71 views
3

考虑下面的代码:为什么我不能在另一个班级的私人成员的班级中申报朋友?

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的私人成员在任何其他情况下无法访问私人成员,则Screen作为WindowMgr的朋友可能是不好的设计。

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

回答

1

朋友宣言不起作用,因为WindowMgr::relocateScreen()WindowMgr是私人的。

C++标准11.4-7:

“的朋友提名的名字 声明须包含 friend声明之类的 范围访问......”

我个人认为relocateScreen()Screen的私有成员函数,并且WindowMgrfriendScreen。这样,WindowMgr只需拨打relocateScreen()就可以在Screen,并且不必触碰任何Screen的数据成员。

0

WindowMgr将不得不声明屏幕作为朋友。您可以使用前向声明。

+0

前置声明已经存在。事实上,如果我在WindowMgr中将类Screen作为一个朋友,类Screen的声明将被引入到周围的作用域中,明确地消除了对前向声明的需要。 – James 2010-07-22 09:55:51

0

为什么不把WindowMgr :: relocateScreen放到另一个类中,比如WindowMgrFoo和1 relocateScreen函数。 Delcare WindowMgrFoo是Screen in Screen的朋友,并且WindowMgr从WindowMgrFoo私下继承?或者让WindowMgr有一个对WindowMgrFoo的引用,但是如果你公开它,你需要改变它被用户调用的方式。

0

在硅 - 尼斯引用的标准。已经睡在它,我现在看到的基本原理:

通过声明WindowMgr::relocateScreen其paramater名单将在Screen的朋友,在Screen类变得依赖于私人实施WindowMgr类的。这违反了封装/信息隐藏。

为了不违反OOD的原则,只有公共成员函数可以被声明为另一个类的朋友,否则后者变得依赖于前者的私有实现。

相关问题