【问题标题】:Friend functions朋友功能
【发布时间】:2011-09-24 15:24:37
【问题描述】:

只是一个关于使用友元函数的简单问题,或者更确切地说它们的用处。基本上..

它们有什么用处?如果你已经正确设计了你的类,真的需要友元函数吗?在哪些情况下您想使用或不使用它们?有人告诉我它们增强了封装性,但根据我的经验,在我编码的 7 年中,我只使用了一个朋友功能。在进一步检查和重构我的代码后,我意识到我什至不需要使用它。似乎它们在某种程度上违反了封装,而不是增强了封装。这可能是由于我缺乏该领域的知识。

tldr;友元函数有什么用,什么时候应该/不应该使用它们,以及它们如何增强封装性?

【问题讨论】:

    标签: class encapsulation friend


    【解决方案1】:

    谁告诉你朋友函数增强封装是完全错误的,他们恰恰相反。在真正的 OOP 世界中,它们确实没有立足之地。

    但是,生活很少是完美的,有时您需要从框架内的其他类调用受保护的方法,而不将它们暴露给外部。 C# 和 Java 非常优雅地解决了这个问题:它们有一个 internal 修饰符(含义略有不同),但在 C++ 中你只有 friend

    如果你真的已经编程了 7 年而不需要这个构造,那么你要么在你的类中创建每个方法和变量public,或者你根本不使用类。

    【讨论】:

    • 不,我实际上并没有公开所有内容,我只是从未亲自找到它们的用途。但是,我可以看到它们对于相互通信的对象很有用。
    【解决方案2】:

    我能想到的一个场景是多个项目共享代码时。您的 B 类需要访问 A 类中的私有成员,该成员由单独的组拥有。如果你不能打破该类的现有合同,你可以添加一个朋友方法,它可以满足你的需要,而不会破坏其他组的任何东西。

    当然,现在有了 .NET 4,我们能够向类添加动态方法,这完全消除了我的情况。

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 那篇文章描述了朋友的内容,但没有描述 OP 的问题。 “友元函数有什么用处,什么时候应该/不应该使用它们,以及它们如何增强封装性?”
      猜你喜欢
      • 2015-09-29
      • 1970-01-01
      • 2011-04-17
      • 2016-10-21
      • 1970-01-01
      • 2012-08-21
      • 2014-09-18
      • 1970-01-01
      相关资源
      最近更新 更多