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

C++ 在何处/如何声明和实现成员方法必须使用的帮助函数?,c++,function,methods,C++,Function,Methods,我在一个类中实现了一个公共成员方法,该类使用std::sort()。另一方面,函数sort将比较函数(我们称之为helpSort())作为第三个参数 现在的问题是,我必须在哪里或如何声明和实现helpSort(),以便: 它会起作用的 确保了封装 这里认为什么是好的设计 在类中声明它是不起作用的。我认为最好的解决方案是实现 bool helpSort(const T& a, const T& b) 作为一个自由函数,并根据对象的公共可观察属性对其进行排序。如果需要添加const

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

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

  • 它会起作用的
  • 确保了封装
  • 这里认为什么是好的设计


    在类中声明它是不起作用的。

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

    bool helpSort(const T& a, const T& b)
    
    作为一个自由函数,并根据对象的公共可观察属性对其进行排序。如果需要添加
    const
    accessor成员函数,并且它们作为类的可观察属性的一部分是有意义的,则可以添加这些成员函数以实现这一点

    例如,如果您可以将排序函数实现为

    bool helpSort(const T& a, const T& b) { return a.property() < b.property(); }
    
    boolhelpsort(常量T&a,常量T&b){返回a.property()
    property()
    是一个公共函数时,这将使
    helpSort
    函数工作,即使
    T
    的实现发生变化,只要类
    T
    的公共接口/契约保持不变。也就是说,您的
    helpSort
    函数将继续编译并保持有意义,只要
    property()
    的含义没有改变,即使类
    T
    的实现在发展

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

    如果您听过“永远不要有朋友”的建议,可能有人在朋友类中有过不好的经历,这真的会破坏封装

    最后,可以将类中的静态成员函数声明为比较函数。我认为它非常类似于一个没有朋友的函数。自由函数的一个优点是,从结构上讲,它不能通过修改类中的某个静态变量来改变对象的状态

    您可以通过以下链接了解更多有关差异的信息:

    在类中声明为纯文本是行不通的


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

    现在,我已在与类相同的.hpp文件中声明了它,但没有在类中声明(在.cpp中实现),并且它可以工作。我仍然不确定这是否是一个好的设计,因为排序标准只适用于这个单成员方法。很抱歉编辑,因为我想到了如何更详细地解释。您将如何描述您当前的解决方案:一个自由函数,还是一个作为朋友函数的自由函数。不会在其他地方使用。我认为将它放在相同的头文件/源文件中就可以了。在类中是否有
    朋友
    声明?它是否按常量引用进行操作?如果您愿意,您可以发布函数的声明(而不是实现),以查看是否有人有基于该函数的特定反馈。WRT封装,如果类位于自己的命名空间中,在该命名空间中使用helpSort()也将有助于封装(因为我想您说过这是公开的)。OTOH,如果这个助手只在内部使用,并且您不希望它公开,那么它可以驻留在实现文件中。我不熟悉在方法中使用静态声明的效果。