5

わかりました、以下のコードを詳しく調べてください。これは関数の一部にすぎません

void RepeatWord(){
    system("cls");
    string word = NULL;
    string newword = NULL;
    int repeats = 0;
    while(true){
        if(word == NULL){
            cout<<"Currently no word is stored..";
            cout<<"\n\nPlease enter a word: ";
            cin>>word;
        }
....

私は他のプログラミング言語で作業しており、常にNULL値との比較を行っていますが、C ++では...別の状況のようです。エラーは言う..

エラー: 'word == 0' の 'operator==' に一致しません

私はただ a と比較しているだけだと思っていましたNULLが、なぜこれが間違っているのか本当にわかりません。値をNULLC++ と比較するのは違いますか? 教えて下さい。ありがとう

注: Java より Ruby の方が詳しい

4

2 に答える 2

9

オブジェクトを と比較しようとしています。NULLオブジェクトを と比較することはできませんNULL。ポインタを比較する必要があります。そうすることで、ポインターが有効なオブジェクトではないものを指しているかどうかを確認します。

あなたの場合、std::string空かどうかを確認したい。std::string、によって提供されるメンバー関数を使用できますstd::string::empty()

あなたの質問を考慮して、私は優れた学習書の必要性を強調しています:

The Definitive C++ Book Guide and List

于 2013-03-28T06:07:29.700 に答える
3

Java の世界から来ている場合は、C++ のオブジェクトが同じように処理されないことに気付くでしょう。C++ では、特に明記しない限り、データは直接操作されます。Java では、オブジェクトは VM によって完全に管理されます。このため、プログラムがオブジェクトに参照のみでアクセスできるようにすることは理にかなっています。したがって、Java プログラムを作成するときはいつでも、VM に を使用してオブジェクトを割り当てるように指示しnew、それまでnullはクラス インスタンスの変数に割り当てる必要があります。同じ原則に従って、オブジェクト変数を別の変数に割り当てると、両方が同じオブジェクトを参照し、いずれかでメソッドを呼び出すと、同じ基になるインスタンスでそのメソッドが呼び出されます。

C++ では、同じ結果を得るために 2 つの異なるメカニズムがあります。

  • 型の構文T

    T *t;
    

    へのポインターを保持するというstd::string *word;名前の変数を定義します。wordstd::string

  • 参照を使用して:

    T &t;
    

C++ では、これらは両方とも実際には型です。std::stringstd::string *std::string &は 3 つの異なるタイプです。最初のものは実際には構造化された値自体を示していますが、他の 2 つは type の値への間接性を示していますstd::string

これらのタイプのインダイレクションの違いは、この SOエントリで説明されています。

コードでは、 のすべての出現箇所をNULL空の文字列リテラルに置き換えるか、ポインターを使用してステートメントを""使用してインスタンスを割り当ててから、行のようにオブジェクトを使用する必要があります。newcin >> word;

于 2013-03-28T06:56:58.930 に答える