0

我正在尝试实现一个类似于绘画的绘图程序。我有两个包含 shared_ptrs 到 Shapes 的 std::lists。一个是“Undo”链表,另一个是“Redo”链表。在我对Shape shared_ptr 调用reset 之前,通过push_back 将shared_ptr 添加到Undo 链表中。

LRESULT CDrawView::OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
   int xPos= GET_X_LPARAM(lParam);
   int yPos = GET_Y_LPARAM(lParam);
   end.X = xPos;
   end.Y = yPos;
   m_shape->setEnd(xPos,yPos);
   m_shape->Draw(m_GraphicsImage);
   Undo.push_back(m_shape);
   RedrawWindow();
return 0;
}

当给出 Undo 命令时,我抓取 Undo 链表后面的 shared_ptr 并将其移动到 Redo 链表中。然后,将 m_GraphicsImage 清除为白色,最后尝试遍历 Undo 列表,重绘所有内容。

LRESULT CMainFrame::OnUndo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
   m_view.Redo.push_back(m_view.Undo.back()); //gets the first element that was Undo
   m_view.m_GraphicsImage.Clear(255); //Clears the board

   for(std::list<std::shared_ptr<Shape>>::iterator it = m_view.Undo.end(); it!=m_view.Undo.begin() ; it--)
   {
     it->get()->Draw(m_view.m_GraphicsImage);
   }
return 0;
}

我不断得到 list iterator not deferencable....我只是想创建一个简单的撤消和重做

4

1 回答 1

2

取消引用end()迭代器是非法的,这是在此循环的第一次迭代中发生的:

for(std::list<std::shared_ptr<Shape>>::iterator it = m_view.Undo.end();

list::end()参考页面:

返回指向容器最后一个元素之后的元素的迭代器。该元素充当占位符;尝试访问它会导致未定义的行为。

如果您希望向后迭代,请使用reverse_iterators,rbegin()和:rend()

for (std::list<std::shared_ptr<Shape>>::reverse_iterator i(l.rbegin());
    i != l.rend();
    i++)
{
}

由于您有可用的 c++11 功能 ( std::shared_ptr),您可以使用它auto来推断iterator类型,而不是显式键入它:

for (auto i(l.rbegin()); i != l.rend(); i++)
{
}
于 2013-03-28T08:59:26.707 回答