10

クラスを使用した List (およびそのノード) の実装を読んでいて、よくわからないことがいくつか見つかりました。私が理解していない Node クラスのコードは次のとおりです。

    class Node {
      private:
         Data data;
         Node* next;
      public:
         Node*& getNext();
    };

    Node*& Node::getNext()
    {
       return this->next;
    }

*& とは正確には何ですか? そのメソッドによって返される変数の種類がわかりません。

私は今それを手に入れたと思います、後で私はこれらの行を持っています(クラスリスト内):

Node** node = &first;
node = &(*node)->getNext();       

次のアドレスを node* に格納しているということですか?

注:2番目の質問はコメントで回答されました。返信ありがとうございます。

4

4 に答える 4

9

それはポインターへの参照です。Node*関数が返すのは のエイリアスであることを意味しますNode::next

たとえば、次のようにします。

Node n;
n.getNext() = NULL;

これは に設定n.nextされNULLます。

メソッドが参照によって返されなかった場合

Node* Node::getNext()  //no reference
{
   return this->next;
}

同じコード

Node n;
n.getNext() = NULL;

しません変更n.next- この場合、初期化されないままになりますgetNexthere を返すため、コンパイルしrvalueます。

または、参照によって返す:

Node*& x = n.getNext();
x = new Node;

への参照のようn.nextに、を変更します。xn.next

于 2012-10-23T17:47:22.570 に答える
4

比較

class Node {
  private:
     Data data;
     Node* next;
  public:
     Node*& getNext();
};

Node*& Node::getNext()
{
   return this->next;
}

class Node {
  private:
     Data data;
  public:
     Node* next;
};

これらのコード スニペットはほとんど同じことを達成しますが、後者は

  • 短く、

  • よりシンプルに、そして

  • nextオブジェクト上でもポインターにアクセスできconstます。

Getしたがって、接頭辞や の使用などの Java イズムは言うまでもなく、不必要な複雑さと制限を考えると、そのコードに見られる構造体や名前付けでさえ、ほとんどの場合意味this->がないと想定できます。悪影響を及ぼします – 確かにメソッドが持っているように、アクセスを制限します.GetNext

技術的な詳細: &C++ は「参照」を意味します。C++ 参照の最も基本的な説明は、それが何らかのオブジェクトのエイリアスであるということです。C++03 では、参照はそれが参照するオブジェクトと区別できませんでした。C++ のバージョンに関係なく、有効なコードには null 参照などはありません。

ポインターと参照について実際に学ぶには、ネット フォーラムの回答に頼るのではなく、優れたC++ の教科書を使用する必要があります。

SO C++ FAQ ブック リストには、教科書に関する多くの優れた提案があります。

于 2012-10-23T17:57:54.317 に答える
4
Node*& getNext();

への参照を返しますNode*。関数の呼び出し元がその値を変更できるようにするために、ポインターへの非定数参照を返すことを選択した理由は...わかりません。

于 2012-10-23T17:47:29.830 に答える
4

つまり、参照によってポインターを返しているということです。誰かがノード内の実際のポインターを変更できることを意味します。

Node anode = /* something... */;
anode.getNext() = nullptr;
assert(anode.getNext() == nullptr); // assertion passed!

これは、これを使用する状況のようには見えません。ポインタを返すだけです:

Node* Node::getNext()
{
   return next;
}
于 2012-10-23T17:47:55.330 に答える