2017-09-14 128 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而不是數組將使內存管理更容易。

相關問題