2017-09-14 127 views
0

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

你为什么不直接使用'strcmp'? –

+0

移动stringcomp上面的sort。 – ZDF

+0

@ZDF我认为这不会有帮助;我认为'Par'是一个类,而不是一个名字空间。 –

回答

1

用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中使用的函数不同,并且略微超出了问题的范围。

0

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

相关问题