C ++ STL: список с указателями - Итератор не может получить доступ? - PullRequest
14 голосов
/ 23 июня 2011

Я борюсь со списком STL, который содержит указатели моего объекта "Object".

Я объявил:

list<Object*> objectlist;

и вставляется через:

this->objectlist.push_back(new Object(address,value,profit));

и попытался повторить как в картах и ​​других:

list<Object*>::iterator iter;

iter = this->objectlist.begin();

while(iter != this->objectlist.end())
{
    iter->print();
}

Где print () - это открытый метод класса Object;

Что здесь не так?

Я не могу получить доступ через итератор к объектам в списке?

Ответы [ 7 ]

30 голосов
/ 23 июня 2011

Вам нужно (*iter)->print();

Поскольку у вас есть итератор для указателя, вы должны сначала отменить ссылку на итератор (который возвращает вам Object*), затем стрелка отменяет ссылку на Object * и позволяет распечатать звонок.

7 голосов
/ 23 июня 2011

Вы не увеличиваете свой итератор! Измените ваш while цикл на for цикл следующим образом:

for (list<Object*>::const_iterator iter = this->objectlist.begin(),
     end = this->objectlist.end();
     iter != end;
     ++iter)
{
    (*iter)->print();
}

(Также iter разыменовывает указатель, как указали другие ответы.)

3 голосов
/ 23 июня 2011

Вы можете получить доступ к значению, указанному итератором, с помощью * iter

Также не забывайте увеличивать итератор в каждой итерации.В противном случае вы застрянете в бесконечном цикле.

Вот так:

iter = this->objectlist.begin();

while(iter != this->objectlist.end())
{
    (*iter)->print();
    iter++;
}
2 голосов
/ 08 февраля 2013

Вы можете попробовать C ++ 11 (если возможно). Разыменование итератора происходит бесплатно:)

for (auto& iter: this->objectlist)
{
     iter->print();
}

Также, если print () является константной функцией, вы должны использовать

for (const auto& iter: this->objectlist)
1 голос
/ 26 мая 2014

Вместо for -циклов вы должны использовать STL for_each() - посмотрите преимущества for_each по сравнению с простым for -циклом.

Синтаксис

#include <algorithm> // 'for_each()' is in there

std::for_each(InputIterator first, // Iterator start position
              InputIterator last,  // Iterator end position
              Function fn);        // Unary function - executed on all elements in range

for_each пример

Вот как выглядит ваш пример std::for_each() вместо for( ... ):

list<Object*> objectlist;

// insert some elements …

// Deletes all elements of 'objectlist'
std::for_each(objectlist.begin(), objectlist.end(), DeleteObj<Object*>());

Унарная функция

Унарная функцияреализован с использованием шаблона, поэтому вы можете использовать его с любого типа.Просто убедитесь, что T является указателем типа !

template<class T> class DeleteObj
{
public:
    bool operator()(T obj) const
    {
        delete obj;
        return true;
    }
};

Кстати.у вас нет для реализации этого в качестве шаблона.И: вы можете связывать функцию-член вместо такой реализации тоже!

Документация

0 голосов
/ 23 июня 2011

Итератор ссылается на элемент в списке, поэтому для списка типа T разыменование итератора дает значение типа T.

В вашем случае T на самом деле является указателем - Object*. Следовательно, вызов iter-> (который разыменовывает итератор) дает указатель. Вы должны разыменовать этот указатель, чтобы добраться до объекта.

Попробуйте использовать

(*iter)->print()

вместо.

0 голосов
/ 23 июня 2011

вы должны использовать следующий способ:

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