2012-10-02 2 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'를 사용하는 것은 정의되지 않은 행동입니다. 그것은 무엇이든 할 수 있으며, 온통 구토하는 것이 더 즐거운 가능성 중 하나입니다. –

답변

3

당신은 &Data::compare_records로 기능을 통과,하지만 당신은 표준을 위해, 그것은 static

+3

두 개는 C++에서 동일하고, pedantically, 첫 번째 버전은 실제로 의도에 표현이 풍부합니다. –

+0

감사합니다. 그것에 대해 몰랐습니다. 실제로, 함수 이름은 이미 함수에 대한 포인터입니다. 그래서 기억하고 있었고 어쩌면 잊었습니다.'&'는 거기에서 금지되어 있지 않습니다. –

6

당신이 qsort를 사용해야하는 경우와하지 std::sort (를 권장), static로 멤버 메소드를 선언하는 것만으로는 충분해야한다.

+1

나는 "(추천)"을 더 강하게 만들 것이다. 'std :: sort'는 * 더 빠르며 * 더 유연하고 * typesafe합니다. –

+0

크고 (더 많은 바이너리 코드 생성). 그러나 당신이 그것에 관심이 있다면, 아마도 C++을 처음에는 사용하지 않고있을 것입니다. –

0

이 코드는 힌트로서 도움이 될 수 있도록도 Data::compare_records로 전달해야하고 :: 종류의 사실에도 불구하고 내가 사용 Qt의 (15.3)

펑크는 매우 멋지다.

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); 
} 
관련 문제