我在类中实现了一个公共(public)成员方法,它使用 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()
是一个公共(public)函数,这将使 helpSort
函数工作,甚至作为 T 的实现
更改,只要类 T
的public 接口(interface)/契约(Contract)保持不变。也就是说,只要 property()
的含义没有改变,您的 helpSort
函数将继续编译并且保持有意义,即使您对 T
类的实现不断发展。
如果您需要的访问器数量变得不合理,我认为将 helpSort
声明为 friend
函数是合理的。我个人认为以 const
实例作为参数的友元函数比 friend class
情况危险得多(我不惜一切代价避免)。原则上,这样的功能可以通过公共(public)访问器来实现,但可能会不方便或不合理。
如果您听过“永远不要有 friend ”的建议,那么可能有人对 friend 类 有不好的体验,这真的会破坏封装。
最后,您可以在类中声明一个静态成员函数作为比较函数。我认为它与 friend 免费功能非常相似。自由函数的一个优点是,从结构上讲,它不能通过修改类中的某些静态变量来改变对象的状态。
您可以在这些链接中阅读更多关于差异的信息:
What kind of member access do friend and static member functions have?
关于c++ - 成员方法必须使用的帮助函数在哪里/如何声明和实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19804292/