我在类中实现了一个公共成员方法,该方法使用std :: sort()。另一方面,函数sort将比较函数(我们称之为helpSort())作为第三个参数。
现在问题是,我在哪里或如何声明和实现helpSort()以便:
这里认为什么是好设计?
在课堂上宣布它是不合适的。
答案 0 :(得分: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
函数工作,甚至随着T
的实现发生变化,只要<类T
的em> public 接口/合同保持不变。也就是说,只要helpSort
的含义没有改变,property()
函数将继续编译并且仍然有意义,即使你的类{{1}的实现也是如此}进化。
如果您需要的访问者数量变得不合理,我认为声明T
helpSort
函数是合理的。我个人认为将friend
个实例作为参数的朋友函数比const
个案(我不惜一切代价避免)的危险要小得多。原则上,这样的功能可以用公共访问者来实现,但也许它会带来不便或不合理。
如果您听过“永远不会有朋友”的建议,那么有可能有人与朋友类有不好的经历,这真的会破坏封装。
最后,您可以在类中声明一个静态成员函数作为比较函数。我认为它与朋友免费功能非常相似。自由函数的一个优点是,从结构上来说,你知道不能通过修改类中的一些静态变量来改变对象的状态。
您可以在这些链接中详细了解差异:
What kind of member access do friend and static member functions have?
答案 1 :(得分:1)
在课堂上宣布它是不合适的。
为什么不呢?您可以将helpSort()
写为静态私有成员函数,并将其作为比较器传递,它应该可以正常工作。如果不了解您正在尝试做的事情,那将是我的首选解决方案。