0

我在一个类中实现了一个公共成员方法,它使用 std::sort()。另一方面,函数 sort 将比较函数(我们称之为 helpSort() )作为第三个参数。

现在的问题是,我必须在哪里或如何声明和实现 helpSort() 以便:

  1. 它会起作用的。
  2. 确保封装。

什么被认为是好的设计?

在课堂上简单地声明它是行不通的。

4

2 回答 2

1

我认为最好的解决方案是实施

bool helpSort(const T& a, const T& b)

作为一个自由函数,并根据对象的可公开观察的属性对对象进行排序。如果const您需要添加访问器成员函数,并且它们作为类的可观察属性的一部分是有意义的,那么您可以添加这些成员函数来完成此操作。

例如,如果您可以将排序功能实现为

bool helpSort(const T& a, const T& b) { return a.property() < b.property(); }

哪里是公共函数,只要类的公共接口/合同保持不变property(),这将使helpSort函数工作,即使实现发生变化。也就是说,您的函数将继续编译保持有意义,只要其含义没有改变,即使您的类的实现在发展。TThelpSortproperty()T

如果您需要的访问器数量变得不合理,我认为声明helpSort一个friend函数是合理的。我个人认为将实例作为参数的友元函数比用例(我不惜一切代价避免)const危险得多。friend class原则上,这样的功能可以用公共访问器来实现,但可能不方便或不合理。

如果你听说过“永远没有朋友”的建议,那么可能有人对朋友有过不好的体验,这真的会破坏封装。

最后,您可以在类中声明一个静态成员函数作为比较函数。我认为它与朋友免费功能非常相似。自由函数的一个优点是你知道,在结构上,它不能通过修改类中的一些静态变量来改变对象的状态。

您可以在这些链接中阅读更多关于差异的信息:

静态成员函数

友元和静态成员函数有哪些成员访问权限?

于 2013-11-06T04:50:40.233 回答
1

在课堂上简单地声明它是行不通的。

为什么不?您可以编写helpSort()为静态私有成员函数并将其作为比较器传递,它应该可以正常工作。在不了解您要做什么的情况下,这将是我的首选解决方案。

于 2013-11-06T05:04:02.630 回答