Итератор для вектора указателей неправильно разыменовывается - PullRequest
6 голосов
/ 13 октября 2010

Вот моя проблема:

У меня есть 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

Почему он выдаёт мне эти ошибки?

Спасибо

Ответы [ 3 ]

23 голосов
/ 13 октября 2010

Поскольку итератор действует как указатель, и в этом случае указатель на указатель .

Вам потребуется:

(*it)->setText("Hello World"); // dereference iterator, dereference pointer
4 голосов
/ 13 октября 2010

Есть ли способ, которым я могу изменить свои итераторы, чтобы он-> работал?

Не напрямую, но вы могли бы сделать что-то вроде:

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

    p->setText("Hello World");
}
0 голосов
/ 13 октября 2010

Как уже отмечали другие, это потому, что объекты, хранящиеся в вашем векторе, являются указателями, поэтому у вас есть дополнительный уровень косвенности к фактическим объектам.

Вы можете использовать boost::ptr_vector длясобирать AguiWidgets по указателю, но работать с ними, как будто они хранятся по значению?Я не использовал это широко, но мое смутное воспоминание состоит в том, что это работает таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...