[英]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.