2017-09-14 11 views
0

呼び出さなければなりませんが、私はちょうど、C++にCから切り替えます。私はcでコマンドライン引数をソートする自分のプログラムをC++に移行しました(つまり、クラスやものを作った)、今実行しようとするとこのエラーが発生します。 関数stringcompの参照を見つけることができません。誰でもそれを修正する方法を助けることができますか? この質問は基本的なものかもしれないので、私の新しいことをC++に赦してください。stringcomp:すべては(C++と比較して)Cでかなり簡単だった一方、非静的メンバ関数への参照が

PS:パーは私のクラス名であるC++で

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

sortの上にstringcompを移動します。 – ZDF

+0

@ZDF私はそれが助けになるとは思わない。私は 'Par'はクラスであり、名前空間ではないと思います。 –

答えて

1

メンバー関数は、オブジェクトのインスタンスから呼び出されなければならない、特別です。 qsort関数は、Cからのホールドオーバーであり、オブジェクトについては認識せず、オブジェクトを使用できません。

この問題を解決する方法はたくさんあります。 1つは、単にメンバー関数ではないstringcompを作ることです。

int stringcomp (const void *x, const void *y) 

第二は、静的メンバ関数にすることです。静的関数は呼び出されるオブジェクトを必要としません。

qsort (s, size - 1, sizeof *s, Par::stringcomp); 

あなたはまたstd::sortを使用することを検討すべきである、それはソートやってのC++の方法です。オブジェクトにoperator<を実装するか、sort呼び出しに比較機能を提供する必要があります。この比較関数は、Cで使用する関数とは異なり、問題の範囲を少し超えています。 Cから

0

qsort機能は、C++で物事を行うための最善の方法ではありません。型を無視し、多くの問題を引き起こす可能性があります。これらの問題はCでも発生する可能性がありますが、C++ではコンパイル時に型を強制的に適用しようとするため、C++でより目立ちます。

特に、最初に入力したタイプエラーは、strcmpのタイプがqsortが望むタイプと異なることです。引数はさまざまなタイプへのポインタであるためです。それはあなたがそれを呼んでいるどのParオブジェクト知りたい:あなたが持っている新しいエラーはstringcompが、それは隠された第三thisのパラメータを持っている意味、メンバ関数であるということです。あなたはタイプの問題にもかかわらず、qsortを使用し続けたい場合は、まだあなたはどちらかstringcomp静的または改善する必要があり、thisを必要としない最初の場所でParクラスに入れないので。

しかし、よりよい解決策は、C++ std::sort機能を使用することです。あなたはstd::string sがサイズを保存する代わりに、NULL終端に頼ることにより、より高速なたくさんのことを行うことができますので、std::stringの代わりにchar const* Sを使用することですさらに良い

std::sort(s, s + size, strcmp); 

としてそれを呼び出すことができます。同様に、配列の代わりにstd::vectorを使用すると、メモリ管理が容易になります。

関連する問題