c++ - 成员方法必须使用的帮助函数在哪里/如何声明和实现?

标签 c++ function methods

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

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

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

什么是好的设计?

在类中简单地声明它是行不通的。

最佳答案

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

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 的实现 更改,只要类 Tpublic 接口(interface)/契约(Contract)保持不变。也就是说,只要 property() 的含义没有改变,您的 helpSort 函数将继续编译并且保持有意义,即使您对 T 类的实现不断发展。

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

如果您听过“永远不要有 friend ”的建议,那么可能有人对 friend 有不好的体验,这真的会破坏封装。

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

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

Static member functions

What kind of member access do friend and static member functions have?

关于c++ - 成员方法必须使用的帮助函数在哪里/如何声明和实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19804292/

相关文章:

c++ - 私有(private)范围内私有(private)继承的动态向下转换

c++ - 如何使用 make 链接 c++ 中不同目录中的对象而不在 makefile 中引用它们?

c++ - 用于移动应用(iOS、Android)的 Crypto++ 库的子集

java - 从主类上的函数调用外部类对象

javascript - 功能英语也执行

c - 如何编写一个函数来永久更改传递的字符串

c++ - 如何检索要在模板中使用的函数的返回类型?

java - 如果我从我的同步方法调用非同步方法是非同步方法线程安全的吗?

java - 如何在编辑输出时读取文件并创建新文件?

java - 两个未排序的列表交集作为列表返回