簡體   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