在使用成员函数作为比较器进行排序的上下文中,由于 ISO C 中的禁止,会出现常见的编译错误获取非限定或带括号的非静态成员函数的地址以形成指向成员的指针
考虑以下代码片段:
class MyClass { int * arr; // other member variables MyClass() { arr = new int[someSize]; } doCompare( const int & i1, const int & i2 ) { // use some member variables } doSort() { std::sort(arr,arr+someSize, & doCompare); } };
尝试将成员函数 doCompare 的地址作为 std::sort 的第三个参数提供时会发生错误。要解决此问题,必须将函数 doCompare 声明为静态。然而,这种方法限制了 doCompare 访问 MyClass 数据成员的能力。
要克服这一限制,可以通过修改 doCompare 将 MyClass 转换为比较函子,如下所示:
bool operator () ( const int & i1, const int & i2 ) { // use some member variables }
随后,排序操作可以调用为:
doSort() { std::sort(arr, arr+someSize, *this); }
注意,doSort方法缺少返回值,可以根据需要进行更正。
或者,可以使用 std::mem_fun 将成员函数转换为自由函数,但语法可能很复杂。尽管如此,建议将函数包装在类中,如下所示:
class MyClass { struct Less { Less(const MyClass& c) : myClass(c) {} bool operator () ( const int & i1, const int & i2 ) {// use 'myClass'} MyClass& myClass; }; doSort() { std::sort(arr, arr+someSize, Less(*this)); } }
以上是如何在C排序中正确使用成员函数作为比较器?的详细内容。更多信息请关注PHP中文网其他相关文章!