Вы не можете вызвать конструктор, как если бы это был обычный метод, вы можете вызвать его только с помощью new
, чтобы создать новый объект:
Kid newKid = new Kid(this.name, this.height, this.bDay);
Но построение нового объекта из вашего Метод toString () - это не то, что вы хотите делать.
Необходимо увеличить итератор сначала (со мной ++) и затем удалять предыдущий элемент (например, при помощи возвращенного значения от меня ++). Можно изменить код на некоторое время цикл как так:
std::list<item*>::iterator i = items.begin();
while (i != items.end())
{
bool isActive = (*i)->update();
if (!isActive)
{
items.erase(i++); // alternatively, i = items.erase(i);
}
else
{
other_code_involving(*i);
++i;
}
}
Необходимо сделать комбинацию ответа Kristo и MSN:
// Note: Using the pre-increment operator is preferred for iterators because
// there can be a performance gain.
//
// Note: As long as you are iterating from beginning to end, without inserting
// along the way you can safely save end once; otherwise get it at the
// top of each loop.
std::list< item * >::iterator iter = items.begin();
std::list< item * >::iterator end = items.end();
while (iter != end)
{
item * pItem = *iter;
if (pItem->update() == true)
{
other_code_involving(pItem);
++iter;
}
else
{
// BTW, who is deleting pItem, a.k.a. (*iter)?
iter = items.erase(iter);
}
}
, Конечно, самое эффективное и SuperCool® STL savy вещь был бы чем-то вроде этого:
// This implementation of update executes other_code_involving(Item *) if
// this instance needs updating.
//
// This method returns true if this still needs future updates.
//
bool Item::update(void)
{
if (m_needsUpdates == true)
{
m_needsUpdates = other_code_involving(this);
}
return (m_needsUpdates);
}
// This call does everything the previous loop did!!! (Including the fact
// that it isn't deleting the items that are erased!)
items.remove_if(std::not1(std::mem_fun(&Item::update)));
Вы хотите сделать:
i= items.erase(i);
, Который правильно обновит итератор для указания на местоположение после итератора, который Вы удалили.
Станд. использования:: алгоритм remove_if.
Редактирование: Работа с наборами должна быть похожей: 1. подготовьте набор. 2. набор процесса.
Жизнь будет легче, если Вы не смешаетесь, это ступает.
Удаление делает недействительным только итераторы, которые указывают на элементы, которые удалены.
Так в этом случае после удаления *я, я делаюсь недействительным, и Вы не можете сделать инкремента на нем.
то, Что можно сделать, является первым сохранением итератор элемента, который должен быть удален, затем увеличить итератор и затем удалять сохраненный.