如果我有三个班级,A,B,C。A和B是朋友(双向)。此外,B和C是朋友(双向)。 A有一个指向B的指针,B有一个指向C的指针。为什么A不能通过指针访问C的私有数据?
只是澄清:这是一个纯粹的理论C ++语言问题,而不是设计建议问题。
答案 0 :(得分:132)
John是我的朋友,他可以随时使用我的无线连接(我相信他) 约翰的朋友蒂姆虽然是一个浪费,虽然约翰是我的朋友,但我不把蒂姆当作朋友,因此我不让他使用我的无线连接。
约翰的孩子也是一群流氓,所以我不相信他们,他们绝对不是我的朋友,也不是我自己的孩子,我相信我可以抛弃他们。
虽然我们的孩子无法直接访问无线网络,但如果他们通过我们,他们可以访问无线网络。因此John的孩子可以通过John访问我的无线网络(即他们受到John的监督和保护)。
John有一份政府工作,所以不幸的是他不能信任任何人,特别是涉及无线时。
这允许像复制构造函数这样的东西,你可以访问另一个对象的私有成员,即使没有真正的访问。
所以我也自动成为我所有克隆人的朋友:-)因为他们只是我自己的其他情况。
答案 1 :(得分:24)
C ++中的友谊不是传递性的:
(A is friend of B) and (B is friend of C) does not mean (A is friend of C)
此外,友谊不是对称的。
(A is friend of B) does not mean (B is friend of A)
你必须明确声明A是C的朋友才能从A中访问C的私有内容。如果向类中添加setter和getter会暴露出不打算暴露的信息,那么你应该考虑朋友找不到你的设计有问题(使用朋友是有效的。这不是糟糕设计的标志)。如果你可以添加一个setter和getter而不破坏界面,那么你应该避免让其他类成为朋友。请注意,嵌套类始终是嵌套类的朋友。因此嵌套类可以看到嵌套类的私有。
答案 2 :(得分:3)
我在等待回复时发现了这篇文章。它很好地回答了我的问题: Friend scope in C++
答案 3 :(得分:3)
因为在C ++中,友谊不是传递属性。实际上应该尽可能避免它,因为它会在系统中引入复杂性。
想象一下,B是一个中介类,A和C是需要管理的组件,你真的认为按钮应该需要访问复选框的实现吗?
顺便说一句,在你问的情况下,我看不到你的标题的“等级”。
答案 4 :(得分:2)
这一点总结如下:
What does it mean that "friendship isn't inherited, transitive, or reciprocal"?
- >
这意味着从朋友类派生的类不会 自动成为朋友(你相信朋友的孩子吗?), 朋友的朋友不会自动成为朋友(你呢? 相信你的朋友的朋友?),并宣布一个班级 另一个班级作为“朋友”不会自动成为朋友 那个班(你相信那些叫你朋友的人吗?)。
这