【发布时间】:2024-10-12 05:00:02
【问题描述】:
有一个类包含一些数据,它会在某个时间点对它们进行排序。我使用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*)’
那怎么做才是正确的呢?
【问题讨论】:
-
你不应该在 C++ 中使用
qsort。绝不。曾经。std::sort更快,更灵活和类型安全,qsort不是这些。忘记qsort曾经存在过吧,至少除非你遇到需要使用纯 C 的环境。 -
您应该使用
std::sort而不是C函数qsort。该函数采用void *参数这一事实破坏了编译器可以进行的大部分优化(conf H. Sutter)。 -
事实上,如果
Data具有非平凡的复制构造函数或非平凡的析构函数,则使用qsort是未定义的行为。它可以做任何事情,在记忆中呕吐是更令人愉快的可能性之一。
标签: c++