C ++中的朋友类

时间:2016-04-22 10:25:27

标签: c++ friend-class

这里我不太了解这个概念或者我是对的....所以我们在这里拿这个“朋友”类的例子:

class MyClass{
friend class AnotherClass;
private:
       int secret;
}

class AnotherClass{
public:
      void getSecret(MyClass mc){
          return mc.secret;
      }
}

所以是的......在上面的代码中,如果你这样做,它实际上会起作用......但总的来说,为什么你不能一直使用getter和setter而不是朋友类?因“乏味”而导致朋友类使用的原因是什么?

4 个答案:

答案 0 :(得分:7)

friend适用于您不希望向所有人公开getter / setter / internals,而只是针对单个类。所以它是封装工具。

例如,如果您在getSecret中提供了公开MyClass,则每个人都可以访问该私有变量,即使他们不应该知道它。这破坏了封装。 friend可以解决此问题,因此只有那些需要了解secret的类才能访问它。

正如@nicomp所说,“这就像给你的实体朋友一把钥匙送给你的房子,但你不知道他们会用它做什么”。因此,friend类可以无限制地访问其所有类的所有内部。这很不幸,但这里的关键(没有双关语)是为了让课程尽可能小,这样就不会成为一个问题,这也是根据单一责任原则。

答案 1 :(得分:2)

公共 getter setter 允许任何人访问。它们有一些用途,特别是在更改某些属性时维护类不变量,但看起来像以下代码的getter / setter对并不比公共成员变量更好:

class A {
 public:
  int getX() const { return x; };
  void setX(int x_) { x = x_; };
 private:
  int x;
};

getX()setX()函数除了提供对x的访问权限外什么都不做。每个人都可以使用它们,所以任何人都可以改变x的值。那么,没有必要把它变成私有的。

如果只有某些类或函数需要能够更改x,那么您可以将它们变成类A的朋友。这限制了对这些朋友的访问权限,而不是将其提供给每个人。

因此,friend是一种封装工具,允许封装比我自己的类更广泛" (私人会员)或"只是我的课程和课程来源于它" (受保护的成员)。一个朋友不需要在同一个类层次结构中(它根本不需要是一个类;函数可以是朋友),但它仍允许您限制只访问那些实际需要它的东西。

请注意,与getter和setter一样,应谨慎使用。封装是一件好事,在可能的情况下,你班级的私人成员应该保持私密性。 friend是一个允许您有选择地授予访问权限的工具,但是您应该始终仔细考虑是否需要授予该访问权限,或者需要它的函数/类是否会更好地作为您的类的成员,代替。

答案 2 :(得分:0)

考虑我最近遇到的以下用例:我将一些代码中的一些代码重构为另一个类。这个新类必须访问原始类的成员,但我不想通过公共getter提供这个,以避免其他客户搞乱这些。在这种情况下,我真的很欢迎C ++ - 友好机制。

然而,这些用例很少(希望,否则你的SW架构可能有问题)我会尽量避免它,因为它是最紧密的耦合形式

答案 3 :(得分:0)

别忘了测试...

朋友类/方法可以非常成功地用于测试类功能中的中间状态。

这些对于某些类型的复制构造函数也很有用,其中要复制的类不是目标类的直接祖先。