6

いくつかのデータを含むクラスがあり、ある時点でそれらをソートします。を使用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

4 に答える 4

7

使用する必要があり、使用qsortしないstd::sort(推奨) 場合は、メンバー メソッドを宣言するstaticだけで十分です。

于 2012-10-02T11:25:11.840 に答える
4

qsortC++ では使用しないでください。とを使用std::sortboost/std::bindます。メンバー関数ポインターを関数ポインターに変換できませんでした。あなたのメソッドは であるstaticか、 である必要がありますfree function

「メンバー関数へのポインター」の型は「関数へのポインター」とは異なりますか? を参照してください。説明のために。

于 2012-10-02T11:24:26.613 に答える
4

関数を として渡しますが、 として渡し、それも作成する&Data::compare_records必要がありますData::compare_recordsstatic

于 2012-10-02T11:27:35.573 に答える
0

このコードは、Qt の qSort() を使用しているという事実にもかかわらず、std::sort のヒントとしても役立つ場合があります。

ファンクターは非常にクールです。

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);
}
于 2013-08-18T16:30:31.773 に答える