我在一个类中实现了一个公共成员方法,它使用 std::sort()。另一方面,函数 sort 将比较函数(我们称之为 helpSort() )作为第三个参数。
现在的问题是,我必须在哪里或如何声明和实现 helpSort() 以便:
- 它会起作用的。
- 确保封装。
什么被认为是好的设计?
在课堂上简单地声明它是行不通的。
我认为最好的解决方案是实施
bool helpSort(const T& a, const T& b)
作为一个自由函数,并根据对象的可公开观察的属性对对象进行排序。如果const
您需要添加访问器成员函数,并且它们作为类的可观察属性的一部分是有意义的,那么您可以添加这些成员函数来完成此操作。
例如,如果您可以将排序功能实现为
bool helpSort(const T& a, const T& b) { return a.property() < b.property(); }
哪里是公共函数,只要类的公共接口/合同保持不变property()
,这将使helpSort
函数工作,即使实现发生变化。也就是说,您的函数将继续编译并保持有意义,只要其含义没有改变,即使您的类的实现在发展。T
T
helpSort
property()
T
如果您需要的访问器数量变得不合理,我认为声明helpSort
一个friend
函数是合理的。我个人认为将实例作为参数的友元函数比用例(我不惜一切代价避免)const
危险得多。friend class
原则上,这样的功能可以用公共访问器来实现,但可能不方便或不合理。
如果你听说过“永远没有朋友”的建议,那么可能有人对朋友类有过不好的体验,这真的会破坏封装。
最后,您可以在类中声明一个静态成员函数作为比较函数。我认为它与朋友免费功能非常相似。自由函数的一个优点是你知道,在结构上,它不能通过修改类中的一些静态变量来改变对象的状态。
您可以在这些链接中阅读更多关于差异的信息:
在课堂上简单地声明它是行不通的。
为什么不?您可以编写helpSort()
为静态私有成员函数并将其作为比较器传递,它应该可以正常工作。在不了解您要做什么的情况下,这将是我的首选解决方案。