stringcomp:必须调用非静态成员函数的引用
我刚刚从C切换到C++,而C中的所有内容都相当简单(与C++相比)。我将我在c中的命令行参数排序的程序迁移到了C++(即创建了类和东西),现在我尝试运行它时出现此错误。 它无法找到功能stringcomp的参考。任何人都可以帮助如何纠正它? 这个问题可能是基本的,所以请原谅我对C++的新意。stringcomp:必须调用非静态成员函数的引用
PS:标准杆是我的课名称
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);
}
用C的成员函数++是特殊的,他们必须从对象的实例调用。作为C的延缓功能,qsort
函数不知道对象并且不能使用它。
有很多方法可以解决这个问题。首先是简单地使stringcomp
不是一个成员函数。
int stringcomp (const void *x, const void *y)
第二是使之成为静态成员函数。静态函数不需要调用一个对象。
qsort (s, size - 1, sizeof *s, Par::stringcomp);
你也应该考虑使用std::sort
,这是做排序的C++的方式。您需要在您的物体上实现operator<
,或者提供sort
呼叫的比较功能。这个比较函数与您在C中使用的函数不同,并且略微超出了问题的范围。
C中的qsort
函数并不是C++中最好的方法。它忽略了可能导致一些问题的类型。这些问题也可能发生在C中,但它们在C++中更明显,因为C++试图在编译时更强制执行类型。
特别是,您原来的类型错误是strcmp
的类型不同于类型qsort
想要的,因为参数是指向不同类型的指针。你有新的错误是stringcomp
是成员函数,这意味着它有一个隐藏的第三this
参数:它想要知道哪些Par
对象你调用它。如果您想继续使用qsort
而不管类型问题,那么因为您不需要this
,您应该使stringcomp
为静态或更好,但首先不要将它放在Par
类中。
但是,更好的解决方案是使用C++ std::sort
函数。你可以把它作为
std::sort(s, s + size, strcmp);
更妙的是,而不是使用char const*
小号std::string
S,因为std::string
S可通过存储的大小,而不是依靠空终止做了很多事情更快。同样,使用std::vector
而不是数组将使内存管理更容易。
你为什么不直接使用'strcmp'? –
移动stringcomp上面的sort。 – ZDF
@ZDF我认为这不会有帮助;我认为'Par'是一个类,而不是一个名字空间。 –