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?
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. –
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
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. –