Ответ 1
Вам нужно (*iter)->print();
Поскольку у вас есть итератор указателю, вы должны сначала удалить ссылку на итератор (который получает вас Object*
), тогда стрелка отменяет ссылки на Object *
и позволяет вызвать печать.
Я борюсь с списком 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;
Что здесь не так?
Я не могу получить доступ через итератор к объектам в списке?
Вам нужно (*iter)->print();
Поскольку у вас есть итератор указателю, вы должны сначала удалить ссылку на итератор (который получает вас Object*
), тогда стрелка отменяет ссылки на Object *
и позволяет вызвать печать.
Вы не увеличиваете свой итератор! Измените цикл while
на цикл for
следующим образом:
for (list<Object*>::const_iterator iter = this->objectlist.begin(),
end = this->objectlist.end();
iter != end;
++iter)
{
(*iter)->print();
}
(Также iter
разыменовываются указатели, как и другие ответы).
Вы можете получить доступ к значению, указанному итератором, с помощью * iter
Кроме того, не забудьте увеличить итератор на каждой итерации. В противном случае вы застреваете в бесконечном цикле.
Вот так:
iter = this->objectlist.begin();
while(iter != this->objectlist.end())
{
(*iter)->print();
iter++;
}
Вы можете попробовать С++ 11 (если возможно). Разнообразность итератора освобождается:)
for (auto& iter: this->objectlist)
{
iter->print();
}
Также, если print() является функцией const, вы должны использовать
for (const auto& iter: this->objectlist)
Вместо 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. вам не нужно реализовывать это как шаблон. И: вы можете связать функцию-член вместо такой реализации!
вы должны использовать следующий способ:
(*iter)->print()
Итератор ссылается на элемент в списке, поэтому для списка типа T
разыменование итератора дает значение типа T
.
В вашем случае T
на самом деле является указателем - Object*
. Следовательно, вызов iter->
(который разделяет итератор) дает указатель. Вы должны разыменовать этот указатель, чтобы перейти к фактическому объекту.
Попробуйте использовать
(*iter)->print()
вместо.