有一个类包含一些数据,并在某个时间点对它们进行排序。我使用qsort()
并且我想将比较函数保留在类中作为方法。问题是如何将方法传递给qsort()
,以便编译器(g ++)不会抛出任何警告?
尝试1:
int Data::compare_records(void * rec_1, void * rec_2){
// [...]
}
void Data::sort(){
qsort(records, count, sizeof(*records), &Data::compare_records);
}
这种方式会产生错误:
error: cannot convert ‘int (Data::*)(const void*, const void*)’ to ‘int (*)(const void*, const void*)’ for argument ‘4’ to ‘void qsort(void*, size_t, size_t, int (*)(const void*, const void*))’
尝试2:
void Data::sort(){
qsort(
records, count, sizeof(*records),
(int (*)(const void*, const void*)) &Data::compare_records
);
}
这种方式会产生警告:
warning: converting from ‘int (Data::*)(const void*, const void*)’ to ‘int (*)(const void*, const void*)’
如何以正确的方式做到?
答案 0 :(得分:6)
如果您必须使用qsort
而不是std::sort
(推荐),则将成员方法声明为static
就足够了。
答案 1 :(得分:4)
不要在C ++中使用qsort
。使用std::sort
和boost/std::bind
。成员函数指针无法转换为函数指针。您的方法应为static
,或者应为free function
。
请参阅Is the type of “pointer-to-member-function” different from “pointer-to-function”?获取解释。
答案 2 :(得分:3)
您将该功能作为&Data::compare_records
传递,但您应将其作为Data::compare_records
传递,并将其设为static
答案 3 :(得分:0)
这段代码也可以作为一个提示帮助std :: sort尽管我使用Qt的qSort()
Functors非常酷。
struct randomWSort
{
SatoshiGame* This;
randomWSort(SatoshiGame* g){This=g;}
bool operator()(QString& a, QString& b)
{
return This->randomWSort(a,b);
}
};
bool SatoshiGame::randomWSort(QString& a, QString& b)
{
return rand->rnd() %2;
}
QString SatoshiGame::getRandomString(QStringList words)
{
qSort(words.begin(), words.end(), ::randomWSort(this) );
return words.at(0);
}