2012-10-02 5 views
5

いくつかのデータを含むクラスがあり、ある時点でそれらをソートします。私はqsort()を使用しています。クラス内の比較関数をメソッドとして保持したいと思います。問題は、コンパイラ(g ++)が警告をスローしないようにメソッドをqsort()に渡す方法です。メソッドをqsortに渡すには?

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:この方法では、エラー発生

int Data::compare_records(void * rec_1, void * rec_2){ 
    // [...] 
} 

void Data::sort(){ 
    qsort(records, count, sizeof(*records), &Data::compare_records); 
} 

:試行1

warning: converting from ‘int (Data::*)(const void*, const void*)’ to ‘int (*)(const void*, const void*)’ 

void Data::sort(){ 
    qsort(
    records, count, sizeof(*records), 
    (int (*)(const void*, const void*)) &Data::compare_records 
); 
} 

この方法は、警告を生成します

これは正しい方法ですか?

+1

C++では 'qsort'を使用しないでください。決して。これまで'std :: sort'は*より速く*より柔軟でタイプセーフであり、' qsort'はそのどれもありません。あなたが普通のCを使う環境に入らない限り、少なくともqsortは存在しなかったことを忘れてください。 –

+0

'C'関数' qsort'の代わりに 'std :: sort'を使うべきです。この関数が 'void *'引数を取るという事実は、コンパイラが作ることができる最適化の大半を打ち消します(conf。Hutter)。 – log0

+2

'Data'が非自明なコピーコンストラクタか非自明なデストラクタを持っている場合、' qsort'を使うことは未定義の動作です。それはまったく何事も行うことができ、メモリ全体を嘔吐することはより楽しい可能性の1つです。 –

答えて

3

あなたは&Data::compare_recordsとしての機能を渡していますが、Data::compare_recordsとしてそれを渡し、またstatic

+3

2つはC++で同等であり、pedantically、最初のバージョンは、実際には、意図を表現しています。 –

+0

ありがとう、それについては知らなかった。実際には、関数名はすでに関数へのポインタであり、それは私が覚えていたものであり、おそらくそれは私が忘れてしまった理由で、 '&'はそこでは禁止されていません –

6

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

+1

私は本当に「(推奨)」をより強くします。 'std :: sort'は*より高速で、より柔軟な*と* typesafeです。 –

+0

より大きい(より多くのバイナリコードを生成します)。しかし、あなたがそれを気にしているなら、まずC++を使用していないでしょう。 –

0

このコードはまた、STDのために、ヒントとして役立つことにする必要があります::ソート私は(Qtのqsort関数を使用してくださいという事実にもかかわらず)

Functorはとてもクールです。

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); 
} 
関連する問題