【发布时间】:2013-03-18 15:01:48
【问题描述】:
我正在尝试实现一个类似于绘画的绘图程序。我有两个包含 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;
}
当给出撤消命令时,我抓住撤消链表后面的 shared_ptr 并将其移动到重做链表中。然后,将 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....我只是想创建一个简单的撤消和重做
【问题讨论】:
-
draw.exe当前正在执行吗? -
没有我的 for 循环它工作正常。是的,它是@hmjd ...我的迭代器使它无法编译
-
如果
.exe正在运行,那么它是不可写的。停止.exe然后重建。 -
如何停止 .exe @hmjd。我忘了提。这使用 WTL。
-
在任务管理器中找到它并终止它。
标签: c++ list pointers iterator shared-ptr