2010-10-13 71 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,但使用它们就好像它们按值存储一样?我没有广泛使用它,但我的模糊回忆是它以这种方式工作。