Подтвердить что ты не робот

С++ STL: список с указателями - Итератор не может получить доступ?

Я борюсь с списком 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;

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Вот так:

iter = this->objectlist.begin();

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

Ответ 4

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

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

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

for (const auto& iter: this->objectlist)

Ответ 5

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

Синтаксис

#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;
    }
};

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

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

Ответ 6

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

(*iter)->print()

Ответ 7

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

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

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

(*iter)->print()

вместо.