我的比较函数依赖于 Foo 中的数据成员,因此我希望将它包含在此类中。所有示例都使用有效的全局函数,但它不是我正在寻找的。我希望 Foo 的每个实例都根据对象的当前状态进行不同的比较。
class Foo
{
public:
Foo(){}
int Compare(const void * a,const void * b)
{
//Comparing logic
//This is fine
}
void SortStuff(void)
{
qsort(ObjectArray,MAXOBJECTS,sizeof(Object*), Compare);
}
};
最佳答案
正如@juanchopanza 在评论中提到的,强烈建议您在 C++ 中使用 std::sort
而不是 qsort
。 std::sort
算法正确调用赋值运算符并且是类型安全的,而 qsort
则不然。例如,如果您尝试使用 qsort
对 std::string
数组进行排序,您将得到未定义的行为。
就是说,如果您绝对必须以这种方式使用 qsort
,那么您遇到的问题就是“不可见的 this
”指针。在 C++ 中,成员函数与自由函数有着根本的不同,因为为了调用成员函数,您需要提供一个接收者对象。在你上面写的代码中,你得到一个错误,因为 qsort
需要一个可以用两个参数调用的自由函数,但是你给它一个需要两个参数的成员函数,这实际上确实需要三个参数 - 一个接收器对象和两个指针。
要解决此问题,您有几种选择。一种选择是将函数标记为 static
,表明它是一个作用域在您的类内的自由函数,而不是成员函数。另一种选择是使用 lambda 来定义比较函数,因为没有捕获列表的 C++ lambda 是自由函数。实际上,除非您需要在多个地方使用比较功能,否则我实际上会推荐第二个选项而不是第一个选项,因为它更清楚地表明您只需要一次性使用该功能。
关于c++ - 将比较函数传递给 qsort C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21894665/