2012-10-02 36 views
5

Có một lớp có chứa một số dữ liệu và nó sắp xếp chúng tại một số thời điểm. Tôi sử dụng qsort() và tôi muốn giữ chức năng so sánh trong lớp như một phương pháp. Câu hỏi là làm thế nào để vượt qua một phương pháp để qsort() để trình biên dịch (g + +) không ném bất kỳ cảnh báo?Làm thế nào để vượt qua một phương pháp để qsort?

Cố gắng 1:

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

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

Bằng cách này tạo ra một lỗi:

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*))’ 

Cố gắng 2:

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

Bằng cách này tạo ra một cảnh báo:

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

Làm thế nào để làm điều đó đúng cách?

+1

Bạn không nên sử dụng 'qsort' trong C++. Không bao giờ. Không bao giờ. 'std :: sort' là * nhanh hơn *, linh hoạt hơn và an toàn hơn,' qsort' không là gì cả. Chỉ cần quên 'qsort' từng tồn tại, ít nhất là trừ khi bạn đã từng đến môi trường nơi bạn cần sử dụng đồng bằng C. –

+0

Bạn nên sử dụng' std :: sort' thay vì '' '' 'qsort'. Thực tế là hàm này nhận các đối số 'void *' đánh bại hầu hết các tối ưu hóa mà trình biên dịch có thể tạo ra (conf H. Sutter). – log0

+2

Trên thực tế, nếu 'Dữ liệu' có hàm tạo bản sao không tầm thường hoặc destruct không tầm thường, sử dụng' qsort' là Hành vi không xác định. Nó có thể làm bất cứ điều gì cả, nôn mửa trên tất cả bộ nhớ là một trong những khả năng dễ chịu hơn. –

Trả lời

3

Bạn vượt qua các chức năng như &Data::compare_records, nhưng bạn nên vượt qua nó như Data::compare_records và cũng làm cho nó static

+3

Hai cái này tương đương với C++ và theo ngữ nghĩa, phiên bản đầu tiên thực sự là ý nghĩa hơn cho ý định. –

+0

Cảm ơn, không biết về điều đó. Trên thực tế, tên hàm đã là một con trỏ đến một hàm, đó là những gì tôi nhớ và có lẽ đó là lý do tại sao tôi quên, rằng '&' không bị cấm ở đó –

6

Nếu bạn phải sử dụng qsort và không std::sort (được đề xuất), hãy khai báo phương thức thành viên là static là đủ.

+1

Tôi thực sự sẽ làm cho "(được khuyến nghị)" mạnh hơn. 'std :: sort' là * nhanh hơn *, linh hoạt hơn * và * typesafe. –

+0

Và lớn hơn (tạo thêm mã nhị phân). Nhưng nếu bạn quan tâm đến điều đó, có thể bạn không sử dụng C++ ngay từ đầu. –

0

Mã này cũng có thể giúp như một gợi ý, cho std :: sort mặc dù thực tế tôi sử dụng Qt của qsort()

Functors có thể rất tuyệt.

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); 
} 
Các vấn đề liên quan