在C ++中的朋友范围

如果我有三个class,A,B,C,A和B是朋友(双向)。 另外,B和C是朋友(双向)。 A有一个指向B的指针,B有一个指向C的指针。为什么不能通过指针访问C的私有数据?

只是澄清:这是一个纯粹的理论C ++语言问题,而不是一个devisebuild议的问题。

C ++中的友谊不是传递性的:

约翰是我的朋友,他可以随时使用我的无线连接(我信任他)。
约翰的朋友蒂姆虽然是一个废物,虽然约翰是我的朋友,我不包括蒂姆作为朋友,因此我不让他使用我的无线连接。

友谊不被遗传

另外约翰的孩子们是一群stream氓,所以我不相信他们,不是他们绝对不是我的朋友,也不是我信任的我的孩子,尽可能扔掉他们。

虽然我们的孩子不能直接访问无线,但如果他们通过我们,他们可以访问它。 所以约翰的孩子们可以通过约翰来访问我的无线(即他们受到约翰的监督和保护 )。

而且,友谊不是对称的。

约翰有一个政府的工作,所以他不幸的是不能相信任何人,尤其是当涉及到无线。

你永远是你自己最好的朋友。

这允许复制构造函数,即使没有真正的访问,也可以访问另一个对象的私有成员。

所以我也自动成为我所有克隆的朋友:-),因为它们只是我自己的其他实例。

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暴露的信息并不意味着被暴露,你应该考虑如果你不能发现你的devise有问题(使用朋友是有效的,这不是坏devise的标志)。 如果你可以添加一个setter和getter而不破坏界面,那么你应该避免让其他类的朋友。 请注意,嵌套类始终是嵌套类的朋友。 所以嵌套类可以看到嵌套类的私有。

我刚刚在等待回复时发现了这篇文章。 它很好地回答了我的问题: 在C ++中的朋友范围

因为在C ++中,友谊不是一个传递性的属性。 其实应该尽可能地避免,因为它在系统中引入了复杂性。

想象一下,B是一个中介类,A和C是需要pipe理的组件,你真的觉得button应该需要访问checkbox的实现吗?

顺便说一句,我不知道你的头衔在哪个层次上。

这里总结一下:

 What does it mean that "friendship isn't inherited, transitive, or reciprocal"? 

– >

这意味着来自朋友class的class级不会自动成为朋友(你相信朋友的孩子?),朋友的朋友不会自动成为朋友(你相信朋友的朋友吗?) ,而另一个类声明为“朋友”的类不会自动成为该类的朋友(你相信任何人称你为朋友?)。

http://yosefk.com/c++fqa/friend.html#fqa-14.4