如何将方法传递给qsort?

时间:2012-10-02 11:23:08

标签: c++

有一个类包含一些数据,并在某个时间点对它们进行排序。我使用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*)’

如何以正确的方式做到?

4 个答案:

答案 0 :(得分:6)

如果您必须使用qsort而不是std::sort推荐),则将成员方法声明为static就足够了。

答案 1 :(得分:4)

不要在C ++中使用qsort。使用std::sortboost/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);
}