2013-02-11 36 views
1

通常在C++中,當類A聲明與類B的友誼時,類B可以完全訪問類A的私有成員。我需要做的是讓B類只能訪問A類的一個私人成員,而沒有別的。有沒有什麼辦法,也許在C++ 11中有新東西?單身成員而不是全班同學的朋友聲明?

+0

提取(聲明)說一個成員到自己的類,然後使該類爲'A'和父'B'的朋友? (儘管在那時你可以編寫'B'來定位所述接口類,而不需要友誼。) – millimoose 2013-02-11 22:36:00

+0

繼承可以使這發生,因爲友誼不會被繼承。然而,你應該嘗試找到一個不依賴於友誼的解決方案,因爲試圖用繼承來解決與朋友之間的問題最終會變得很複雜。 – ssube 2013-02-11 22:36:01

+2

getter/setter函數足夠!!!! – billz 2013-02-11 22:36:37

回答

3

不是我所知道的。如果僅允許訪問單個成員非常重要,則可以將數據包裝到具有完全私人成員的其他課程中(C),將該課程作爲B的朋友,併爲A中的C對象提供公開訪問者。

事情是這樣的:

template<class T> class MatesWithB 
{ 
    friend class B; 

    public: 
    MatesWithB(T & val) : data(val) {} 

    private: 
    T& data; 
    operator T&()    { return data; } 
    operator const T&() const { return data; } 
}; 

class A 
{ 
     // ... 
     MatesWithB<int> GetPrivateThingy() { return MatesWithB(thingy); } 

    private: 
     int thingy;   // Shared with class B 
}; 

類似的東西。我沒有通過編譯器來檢查。

但我只是想知道......當你發現自己需要這樣做時,是不是在你的設計中有什麼根本性的缺陷?

1

假設您首先有一個好友功能的好理由,那麼我認爲「相信」朋友功能不會觸及除了應該觸及的其他事物之外沒有任何錯誤。

請記住,任何函數具有您的類的地址[或可以以某種方式到達地址]能夠修改成員變量,如果該函數希望這樣做。它可能無法以便攜式,未來安全可靠的方式實現,但投射指向char *的指針將能夠修改操作系統未確定的類中的任何內容。

點約privateprotectedpublicfriend等是爲了讓編譯器檢查,你是「遵守合同」 - 但它可以通過「聰明」的程序員誰是決心這樣做的覆蓋。作爲這個「合同」的一部分,允許類或函數觸碰它的朋友中的任何東西。這就是來龍去脈。如果你不想這樣做,那麼你不應該宣佈它是一個朋友...