通常在C++中,當類A聲明與類B的友誼時,類B可以完全訪問類A的私有成員。我需要做的是讓B類只能訪問A類的一個私人成員,而沒有別的。有沒有什麼辦法,也許在C++ 11中有新東西?單身成員而不是全班同學的朋友聲明?
1
A
回答
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 *
的指針將能夠修改操作系統未確定的類中的任何內容。
點約private
,protected
,public
,friend
等是爲了讓編譯器檢查,你是「遵守合同」 - 但它可以通過「聰明」的程序員誰是決心這樣做的覆蓋。作爲這個「合同」的一部分,允許類或函數觸碰它的朋友中的任何東西。這就是來龍去脈。如果你不想這樣做,那麼你不應該宣佈它是一個朋友...
相關問題
- 1. 聲明前向聲明的類的成員函數爲朋友
- 2. 朋友聲明*
- 3. 朋友班'沒有成員名爲''
- 4. 朋友類聲明
- 5. 成員是從朋友類
- 6. 沒有類聲明的朋友成員函數
- 7. 是班級自動成爲朋友
- 8. 簡單的朋友聲明C++
- 9. 單身人士引起鏈接錯誤的朋友聲明
- 10. 一個明確的專業化不能成爲朋友聲明
- 11. SQL查找不是其他成員的朋友的成員
- 12. 朋友申報不能向前聲明
- 13. C++中的朋友成員函數 - 正向聲明不起作用
- 14. 全班同步的成員方法
- 15. 即使X是Y的朋友,「X不是Y的成員」?
- 16. 朋友分類中的退貨聲明
- 17. 圖 - 顯示朋友(和第一學位朋友)的朋友
- 18. 有班級但不能訪問私人會員的朋友
- 19. 朋友的成員函數不能訪問私有成員
- 20. 如何將封閉類的朋友聲明爲成員模板類?
- 21. 類的朋友函數產生錯誤:「no'___'成員函數聲明」
- 22. 朋友聲明,明確模板實例聲明
- 23. 爲朋友功能使用聲明
- 24. 聲明類模板爲朋友
- 25. 朋友LinkedQueue <T>;預計聲明
- 26. 朋友類聲明和使用指令
- 27. Azure廣告組成員身份聲明
- 28. SQL表爲朋友,共同朋友,朋友朋友等
- 29. 朋友之友/第二學位朋友的名單。 Facebook圖形API
- 30. 面向單身朋友的Facebook AppRequest
提取(聲明)說一個成員到自己的類,然後使該類爲'A'和父'B'的朋友? (儘管在那時你可以編寫'B'來定位所述接口類,而不需要友誼。) – millimoose 2013-02-11 22:36:00
繼承可以使這發生,因爲友誼不會被繼承。然而,你應該嘗試找到一個不依賴於友誼的解決方案,因爲試圖用繼承來解決與朋友之間的問題最終會變得很複雜。 – ssube 2013-02-11 22:36:01
getter/setter函數足夠!!!! – billz 2013-02-11 22:36:37