指针向量的迭代器没有正确解除引用

jma*_*erx 6 c++ iterator vector

这是我的问题:

我有一个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();
}
Run Code Online (Sandbox Code Playgroud)

然后我像这样使用它:

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

我收到这些错误:

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
Run Code Online (Sandbox Code Playgroud)

为什么它会给我这些错误?

谢谢

GMa*_*ckG 23

因为迭代器就像一个指针,在这种情况下是一个指向指针的指针.

你需要:

(*it)->setText("Hello World"); // dereference iterator, dereference pointer
Run Code Online (Sandbox Code Playgroud)

  • 它不是迭代器.这是因为向量是指针的向量.解除迭代器一次为您提供指向AguiWidgetBase的指针,您必须再次取消引用才能使用它. (2认同)

The*_*ish 5

有没有办法可以更改我的迭代器,使其-> 工作?

不是直接的,但你可以这样做:

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

    p->setText("Hello World");
}
Run Code Online (Sandbox Code Playgroud)