【问题标题】:Iterator for vector of pointers not dereferencing correctly指针向量的迭代器未正确解引用
【发布时间】:2011-04-24 15:13:04
【问题描述】:

这是我的问题:

我有一个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,不管那是什么。
  • 你是对的,它们是自毁的

标签: c++ vector iterator


【解决方案1】:

正如其他人所指出的,这是因为存储在向量中的对象是指针,因此您对实际对象具有额外的间接性。

您也许可以使用boost::ptr_vector 通过指针收集 AguiWidget,但使用它们时就好像它们是按值存储的一样?我没有广泛使用它,但我模糊的回忆是它是这样工作的。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      你需要:

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

      【讨论】:

      • 不是迭代器。这是因为向量是指针向量。取消引用迭代器一次会给您一个指向 AguiWidgetBase 的指针,您必须再次取消引用才能使用它。
      • @Milo:不容易,不。您可以制作自己的迭代器。
      猜你喜欢
      • 2011-12-18
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 2014-10-31
      相关资源
      最近更新 更多