2011-06-23 72 views
10

我很努力地用STL列表來保存我的「對象」對象的指針。C++ STL:列表指針 - 迭代器無法訪問?

我宣佈:

list<Object*> objectlist; 

,並通過插入:

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

,並試圖重複像地圖及其他:

list<Object*>::iterator iter; 

iter = this->objectlist.begin(); 

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

其中的print()是一個公共方法對象類;

這裏有什麼問題嗎?

我無法通過迭代器訪問列表中的對象?

回答

26

你需要(*iter)->print();

既然你有一個迭代器的指針,你必須首先去參考迭代器(它可以讓你的Object*),那麼箭頭去引用Object *,並允許調用打印。

+6

是的,你的迭代是** **不是一個指向對象類型,而是一個迭代器。此外_不要忘記你的**增量** _或者你將有一個無限循環。 – crashmstr

0

,你應該使用下面的方法:

(*iter)->print() 
+0

還有更多要說的:* iter意味着元素,所以你應該先獲取元素,然後使用它。 –

+0

是有道理的...指針與指針;) – Stefan

+0

是的,你明白了! –

5

你是不是增加你的迭代器!您while循環更改爲for循環,像這樣:

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

(也iter指針引用的指針,像其他的答案都指出)

3

您可以訪問迭代器指向的值* iter

此外,請記住在每次迭代中增加迭代器。否則你會陷入無限循環。

像這樣:

iter = this->objectlist.begin(); 

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

迭代器引用列表中的一個元素,因此對於T類型的列表,解引用一個迭代產生T類型的值。

在你的情況下,T實際上是一個指針 - Object*。因此,iter->調用(取消引用迭代器)會產生一個指針。你必須將該指針解引用到真正的對象。

使用

(*iter)->print() 

,而不是嘗試。

2

你可以試試C++ 11的方式(如果可能的話)。迭代器的提領是免費的:)

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

此外,如果打印()是一個const函數,你應該使用代替for

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

2個問題: - 「我」應該是「iter」,對不對? - 是否需要「&」?似乎沒有它也能正常工作 – GeertVc

1

-loop你應該使用STL的for_each() - 看到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例如

這裏是你的榜樣看起來如何的for(...)std::for_each()代替:

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。你沒有來實現這個模板。並且:你可以綁定成員函數而不是這樣的實現呢!

文檔