什么时候在OOP中使用友谊是明智的?

时间:2008-12-15 00:44:35

标签: c++ oop inheritance friend access-control

我目前正在阅读http://www.cplusplus.com教程,我在这里看到了这一部分:http://www.cplusplus.com/doc/tutorial/inheritance.html处理朋友职能朋友课的主题在C ++中。

我的问题是,何时在创建程序时使用友谊是否谨慎?

我得到的唯一线索就是文章里面的一个例子,它展示了一个“复制”一个对象的朋友函数。

5 个答案:

答案 0 :(得分:5)

在Marshall Cline的C++ FAQ Lite中有一些非常好的经验法则。

整件事情很好,但特别是"Do friends violate encapsulation?"看到了使用它们的正确方法的例子,以及什么时候最好拆分课程并宣布他们为朋友。

答案 1 :(得分:4)

存在友元函数是为了将自由函数作为类接口的连续部分呈现。有一些地方免费功能是类接口的一部分。示例:假设您具有任意精度类BigNum。以下是朋友职能的一些明显候选人:

// binary operators where BigNum isn't the left-hand operand
BigNum operator+ (int, BigNum);
BigNum operator- (int, BigNum);

// stream operators
std::ostream &operator<< (std::ostream &os, const BigNum &num);
std::istream &operator>> (std::istream &is, BigNum &num);

现在,考虑到这两个例子,在很多情况下,二元运算符不需要是朋友(例如,我可以通过委托给int + BigNum来实现BigNum + int,这是一个成员函数,因此已经有完全访问权限)。但这一切都取决于您对表现的需求,以及您愿意通过班级的公共成员职能公开的内容。

答案 2 :(得分:3)

朋友类的一个很好的应用是Memento设计模式。

答案 3 :(得分:0)

由于朋友通常违反数据隐藏机制,因此只有在真正需要时才能使用它们。如果你的设计很大程度上依赖于朋友,那么在某些方面可能是错误的。

当你不能没有朋友的时候,一个例子是覆盖&lt;&lt;和&gt;&gt;流运营商。此外,朋友类经常用于实现一些设计模式 - 想到“迭代器”。

答案 4 :(得分:0)

我只使用友元方法和属性在类本身中用于克隆本身或将另一个对象分配给自身。这在很大程度上被取代了,我们在我们的设计中重构了设计以实现Memento Design模式。

Memento由用于保存和加载对象的相同机制创建。即Memento创建一个流,对象写入它,并且纪念品可以传递给同一个类的任何其他对象,使其成为创建纪念品的对象的精确副本。

有时候有些对象需要非常紧密地工作,在这种情况下,我通过将它们聚合在另一个对象后面来简化它们的交互。作为“朋友”变量且仅对其他对象可见的变量对于进行聚合的类是私有的。