stringcomp:必须调用对非静态成员函数的引用

时间:2017-09-14 22:49:31

标签: c++

我刚从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);
}

2 个答案:

答案 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而不是数组将使内存管理更容易。