指向指针的向量迭代器无法正确解引用

7

以下是我的问题:

我有一个 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

为什么会出现这些错误?
谢谢

如果Agui的工作方式像大多数其他GUI框架一样,那么这些小部件是自我销毁的。然后使用shared_ptr将是一个非常糟糕的想法。但这取决于Agui是什么。 - Cheers and hth. - Alf
你说得对,它们正在自我销毁。 - jmasterx
3个回答

24

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

所以您需要:

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

2
不是迭代器的问题。而是因为该向量是指针的向量。对迭代器进行一次解引用会给你一个指向AguiWidgetBase的指针,你还需要再次解引用才能使用它。 - Donnie
1
@Milo:不太容易,你可以自己创建一个迭代器。 - GManNickG

5
有没有办法改变我的迭代器,使其可以使用 it-> 语法?
直接来说是不行的,但你可以尝试以下方法:
```c++ (*it).something ```
或者
```c++ it.operator->()->something ```
以上两种方式都可以达到相同的效果。
for(std::vector<AguiWidgetBase*>::const_iterator it = box->getChildBeginIterator(); 
    it != box->getChildEndIterator(); ++it)
{
    AguiWidgetBase* p = *it;

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

0

正如其他人所指出的那样,这是因为您的向量中存储的对象是指针,因此您需要多一层间接引用来访问实际的对象。

您可以尝试使用 boost::ptr_vector 按指针收集 AguiWidgets,但在处理它们时像按值存储的方式进行操作。我没有广泛使用它,但我模糊地记得它可以这样工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接