2010-10-13 74 views
5

這裏指針的向量是我的問題:迭代器不正確地取消引用

我有一個用於跟蹤子控件的std::vector<AguiWidgetBase*>

我有這兩個函數返回的迭代器:

std::vector<AguiWidgetBase*>::const_iterator AguiWidgetBase::getChildBeginIterator() const 
{ 
    return children.begin(); 
} 

std::vector<AguiWidgetBase*>::const_iterator AguiWidgetBase::getChildEndIterator() const 
{ 
    return children.end(); 
} 

然後我用這樣的:

for(std::vector<AguiWidgetBase*>::const_iterator it = box->getChildBeginIterator(); 
    it != box->getChildEndIterator(); ++it) 
{ 
    it->setText("Hello World"); 
} 

,我得到這些錯誤:

Error 3 error C2039: 'setText' : is not a member of 'std::_Vector_const_iterator<_Ty,_Alloc>' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\main.cpp 112 
Error 2 error C2839: invalid return type 'AguiWidgetBase *const *' for overloaded 'operator ->' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\main.cpp 112 

爲什麼給我這些錯誤?

由於

+0

如果Agui像大多數其他GUI框架一樣工作,那麼這些小部件就會自毀。這將是一個非常糟糕的想法,使用'shared_ptr'。但它取決於Agui,無論如何。 – 2010-10-13 02:13:58

+0

你是對的,他們正在自我毀滅 – jmasterx 2010-10-13 02:16:02

回答

4

有沒有辦法我可以改變我的迭代器,這樣它 - >作品?

不是直接的,但你可以這樣做:

for(std::vector<AguiWidgetBase*>::const_iterator it = box->getChildBeginIterator(); 
    it != box->getChildEndIterator(); ++it) 
{ 
    AguiWidgetBase* p = *it; 

    p->setText("Hello World"); 
} 
23

因爲迭代器的作用就像一個指針,在此情況下的指針的指針

您將需要:

(*it)->setText("Hello World"); // dereference iterator, dereference pointer 
+1

有沒有辦法改變我的迭代器,以便它能夠工作? – jmasterx 2010-10-13 02:05:46

+2

這不是迭代器。這是因爲矢量是指針的矢量。去掉一次迭代器會給你一個指向AguiWidgetBase的指針,你必須重新引用它才能使用。 – Donnie 2010-10-13 02:09:20

+0

所以沒有辦法讓它工作? – jmasterx 2010-10-13 02:12:56

0

正如其他人指出,這是因爲存儲在您的矢量對象是指針,所以你有間接的額外水平實際的物體。

您可能可以使用boost::ptr_vector通過指針收集AguiWidgets,但使用它們就好像它們按值存儲一樣?我沒有廣泛使用它,但我的模糊回憶是它以這種方式工作。