2017-11-15 12 views
0

リストクラスのイテレータを作成しています。イテレータを使用しようとしますがptr-> operator *()では非参照を扱いますが、* ptrでは非参照を扱います

T& operator*() const { 
     return this->currentNode->data; 
    } 

:イテレータは、間接参照演算子を持つ

for(; list->begin() != list->end; (*list_iter).operator++()) 
{ 
    cout << list_iter << endl; 
    cout << list_iter->operator*() << endl; 
    //cout << *list_iter << endl; //not working 
} 

コメント行は、「バイナリexperssionのostreamに及びmylistに無効なオペランド::イテレータを」と言います。同様に、(* list_iter).operator ++()をlist_iter ++または(* list_iter)++に変更すると、同様のエラーが発生します。私は何が起こっていると思う何

はこのようなものです:num2のですが、この場合には

int num1 = 3; 
int *num2 = new int; 
*num2 = 3; 

、NUM1が== * num2のです... * NUM2は、(両方とも整数)NUM1と機能的に似ています整数へのポインタで、* num2は整数になります。

そうに:この場合

MyList list1(); 
MyList *list2 = new MyList(); 

、私は期待してください「*リスト2」「*のNUM2は」NUM1に似ているのと同様に、リスト1に似ているように? num2が逆参照を呼び出すか、MyListをMyListに変換しようとしていますか?

ここでは何が起こっているのか本当に苦労しています。ありがとう!

+1

私は小さな完全なコード例を含める必要があると思います。あなたが投稿したものから、何がうまくいかないのかははっきりしていません。 – Eljay

答えて

0

あなたのループは完全に間違っています。

begin()イテレータがlist_iterに保存されていないため、イテレータend()と直接比較されています。したがって、リストが空でない場合、ループは永遠に実行されます。

(*list_iter).operator++()は、データにアクセスするイテレータを逆参照し、イテレータ自体ではなく、そのデータのoperator++を呼び出します。

cout << list_iterはイテレータとして定義されていません。参照されるデータを出力できるように、イテレータを逆参照する必要があります。cout << *list_iter

cout << list_iter->operator*()は、データにアクセスするイテレータを参照解除し、イテレータ自体ではなく、そのデータのoperator*を呼び出します。

あなたのループはより多くの代わりに次のようになります

for(list_iter = list->begin(); list_iter != list->end(); ++list_iter) 
{ 
    cout << *list_iter << endl; 
} 

あるいは、C++ 11には、あなたの代わりにrange-for loopを使用して、それはあなたのためのイテレータを処理させることができます。

for(auto &data : *list) 
{ 
    cout << data << endl; 
} 
1

オーバーロードされたoperator*は、定義したクラスのオブジェクトで直接使用する場合にのみ有効です。このようなオブジェクトへのポインタには影響しません。ポインタに*を使用すると、それは基礎となるオブジェクトに参照解除されます。 *を追加すると、オーバーロードされたoperator*が呼び出されます。あなたのケースptr->operator*()作品に

MyIterator *iter = new MyIterator(); 
*iter; // This will only dereference the pointer. 
**iter; // This will dereference the pointer and call your operator*. 

->はすでに最初の逆参照を行いますので。これは(*ptr).operator*()に相当します。

通常、イテレータは値によって使用されますが、ポインタの後ろにはほとんどありません。

関連する問題