2011-06-23 4 views
10

私は "オブジェクト"オブジェクトのポインタを保持するSTLリストで苦労しています。C++ STL:ポインタ付きリスト - Iteratorがアクセスできない?

Iが宣言:

this->objectlist.push_back(new Object(address,value,profit)); 

や地図などのように反復することを試みた:介し

list<Object*> objectlist; 

挿入を

プリント()はパブリックメソッドである
list<Object*>::iterator iter; 

iter = this->objectlist.begin(); 

while(iter != this->objectlist.end()) 
{ 
    iter->print(); 
} 

クラスObjectの。

ここで何が間違っていますか?

イテレータからリストのオブジェクトにアクセスできません。

答えて

26

あなたは、矢印デリファレンスあなたはポインタにイテレータを持っているので、あなたが最初のデリファレンスに(あなたObject*を取得)イテレータを持ってObject *(*iter)->print();

を必要とし、印刷の呼び出しを可能に。

(*iter)->print() 
+6

はい、あなたのイテレータは**ない**あなたのオブジェクト型へのポインタが、イテレータです。また、あなたの**増分** _を忘れないでください。無限ループになります。 – crashmstr

0

は、次の方法を使用する必要があります!あなたのwhileループはそうのようなforループに変更します。

for (list<Object*>::const_iterator iter = this->objectlist.begin(), 
    end = this->objectlist.end(); 
    iter != end; 
    ++iter) 
{ 
    (*iter)->print(); 
} 

(またiter逆参照ポインタに、他の回答が指摘しているよう。)

+0

何か言いたいこと:* iterは要素を意味するので、最初に要素を取得してから使用する必要があります。 –

+0

は意味があります...ポインタ付きのポインタ;) – Stefan

+0

はい、それを持っています! –

5

あなたのイテレータをインクリメントされていません。

3

あなたがして、イテレータが指す値にアクセスすることができます* iter

また、各反復でイテレータをインクリメントすることを忘れないでください。さもなければ、あなたは無限ループで立ち往生します。このよう

:タイプTのリストについては、イテレータを逆参照するタイプTの価値を生み出すよう

iter = this->objectlist.begin(); 

while(iter != this->objectlist.end()) 
{ 
    (*iter)->print(); 
    iter++; 
} 
0

イテレータは、リスト内の要素を参照します。

あなたの場合、Tは実際にはポインタObject*です。したがって、iter->呼び出し(イテレータを逆参照する)によってポインタが生成されます。実際のオブジェクトに到達するには、そのポインタを逆参照する必要があります。

ではなく

(*iter)->print() 

を使用してみてください。

2

(可能であれば)C++ 11の方法を試すことができます。イテレータの間接参照は自由来る:)

for (auto& iter: this->objectlist) 
{ 
    iter->print(); 
} 

また、印刷は()あなたが代わりにあなたがSTLのfor_each()を使用する必要があります - ループfor

for (const auto& iter: this->objectlist) 
+0

2つの質問: - 「i」は「iter」にする必要があります。 - "&"が必要ですか?それもなくてもうまくいくと思われる – GeertVc

1

使用する必要があるのconst関数の場合 - advantages of for_eachを参照します単純な上にfor -loop。

構文

#include <algorithm> // 'for_each()' is in there 

std::for_each(InputIterator first, // Iterator start position 
       InputIterator last, // Iterator end position 
       Function fn);  // Unary function - executed on all elements in range 

for_each例ここで

はあなたの例は、std::for_each()代わりのfor(...)どのように見えるかです:単項関数を使用して実装されて

list<Object*> objectlist; 

// insert some elements … 

// Deletes all elements of 'objectlist' 
std::for_each(objectlist.begin(), objectlist.end(), DeleteObj<Object*>()); 

単項機能

テンプレートなので、と入力すればとなります。 Tは、ポインタタイプです。

template<class T> class DeleteObj 
{ 
public: 
    bool operator()(T obj) const 
    { 
     delete obj; 
     return true; 
    } 
}; 

btw。 にはこれをテンプレートとして実装するためのがありません。そして:そのような実装の代わりにメンバー関数をバインドすることもできます!

ドキュメント

関連する問題