我刚从C切换到C ++,而C中的一切都相当简单(与C ++相比)。我将我在c中排序命令行参数的程序迁移到c ++(即制作类和东西),现在当我尝试运行它时,我遇到了这个错误。 它无法找到函数 stringcomp 的参考。任何人都可以帮助如何纠正它? 这个问题可能是基本的,所以请原谅我对c ++的新见解。
PS:Par是我的班级名称
void Par :: sort()
{
int i;
char *s[size-1];
/* assign each argument to a pointer */
for (i = 1; i < size; i++)
s[i-1] = argNew[i];
qsort (s, size - 1, sizeof *s, stringcomp);//It yeilds an error here
for (i = 1; i < size; i++)
{
argNew[i] = s[i-1];
}
}
void Par :: parse(char **argv, int argc)
{
setArgs(argv, argc);
sortArgs();
}
int Par:: stringcomp (const void *x, const void *y)
{
return strcmp (*(char * const *)x, *(char * const *)y);
}
答案 0 :(得分:1)
C ++中的成员函数很特殊,必须从对象的实例中调用它们。 qsort
函数是C的保留函,不知道对象并且无法使用它。
有很多方法可以解决这个问题。第一个是简单地使stringcomp
不是成员函数。
int stringcomp (const void *x, const void *y)
第二个是使它成为静态成员函数。静态函数不需要调用对象。
qsort (s, size - 1, sizeof *s, Par::stringcomp);
您还应该考虑使用std::sort
,这是C ++进行排序的方式。您需要在对象上实施operator<
,或者为sort
调用提供比较功能。此比较函数与您在C中使用的函数不同,并且稍微超出了问题的范围。
答案 1 :(得分:0)
C语言中的qsort
函数不是在C ++中执行操作的最佳方法。它会忽略类型,这可能会导致许多问题。这些问题也可能在C中发生,但它们在C ++中更容易看到,因为C ++试图在编译时更多地强制执行类型。
特别是,您最初遇到的类型错误是strcmp
的类型与qsort
所需的类型不同,因为参数是指向不同类型的指针。您遇到的新错误是stringcomp
是成员函数,这意味着它有一个隐藏的第三个this
参数:它想知道您的Par
对象是哪个重新打电话。如果您希望尽管存在类型问题仍然继续使用qsort
,那么由于您不需要this
,您应该stringcomp
静态或更好,但不要将其放在{{1}中首先是类。
但是,更好的解决方案是使用C ++ Par
函数。您可以将其称为
std::sort
更好的方法是使用std::sort(s, s + size, strcmp);
而不是std::string
,因为char const*
可以通过存储大小而不是依赖于空终止来更快地完成很多事情。同样,使用std::string
而不是数组将使内存管理更容易。