2017-10-14 20 views
0

最近、クラスでは、リストをたどるSTLイテレータについて教えられました。リンクされたリストのための基本的な反復子に与えられたサンプルコードでは、私は理解できなかった何かを見つけました。C++のイテレータクラスの理解

私たちは2つのイテレータクラス、const_iteratorとiteratorを与えられました。それらは両方ともListクラスのサブクラスでした。 const_iteratorから継承したイテレータイテレータのコンストラクタでは、なぜこのように記述されたのか分かりません。

イテレータクラス:

class iterator:public const_iterator{ 
    friend sortedList 
protected: 
    iterator(Node* n):const_iterator(n){} 
public: 
    iterator(){ 
     n = nullptr; 
    } 

const_iteratorのクラス:

class const_iterator { 
    friend SortedList 
protected: 
    Node* curr_; 
    const_iterator(Node* n){ 
     curr_ = n; 
    } 
public: 
    const_iterator(){ 
     curr_ = nullptr; 
    } 

私の質問は、なぜイテレータがconst_iteratorの継承ず、なぜイテレータのコンストラクタはconst_iteratorののctorのを初期化し、それ自体に何もしません。

イテレーターからcurr_にアクセスする際、どのように参照するのですか?私はcurr_を呼び出すか、this-> curr_を使いますか?

+1

これは標準ライブラリコードではありません。それを理解するためには、あなたが求めている実装の多くをもっと見る必要があります。 –

+0

とにかく、 'iterator'のdefault-ctorが壊れています。 – Deduplicator

+1

const_iteratorから継承する根拠を理解するのに役立つhttps://stackoverflow.com/questions/2844466/can-iterator-type-just-subclass-constiteratorを見ることができます。 IMOの公開継承は、ここでは当てはまらない「公開」情報(すなわち、モデルは多態的に使用されるオブジェクトのための関係)を伝えるために使用されるべきであるため、私は個人的にこの方法を好まない。 –

答えて

2

私の質問は、なぜiteratorはconst_iteratorを継承しているのですか?そして、iteratorのコンストラクタがconst_iterator ctorを初期化して何もしないのはなぜですか?

iteratorconst_iteratorに変換可能な標準コンテナが必要です。他のものから1つを導くことは、これを達成する1つの方法です。

const_iterator基底クラス格納Nodeなくiteratorへのポインタは、できるように、基本クラス上にパラメータを渡すことcurr_部材の両方のベースを初期化して使用することができます派生ありません。

イテレータからcurr_にアクセスするにはどうすればいいですか?私はcurr_を呼び出すか、this-> curr_を使いますか?

メンバー変数であるかどうかについて疑問がなければ、curr_を基本クラスと派生クラスの両方で使用できます。名前がアンダースコアで終わるという事実は、メンバ変数名の一般的な規則です。

範囲が疑わしい場合は、this->memberを使用してクラスのメンバーを参照することができます。それが本当に必要とされていない場合this->を使用して

は、(私のような)一部の人によって余分な混乱とみなされるので、おそらく名前を明確にする本当必要がある場合のために保存する必要があります。