C++ 使用共享\u ptr列表撤消/重做

C++ 使用共享\u ptr列表撤消/重做,c++,list,pointers,iterator,shared-ptr,C++,List,Pointers,Iterator,Shared Ptr,我正在尝试实现一个类似绘画的绘图程序。我有两个std::列表,其中包含形状的共享内容。一个是“Undo”链表,另一个是“Redo”。在调用Shape shared_ptr上的reset之前,请通过push_back将共享_ptr添加到Undo链表中 LRESULT CDrawView::OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { int xPos= GET_X_LPARAM(lPara

我正在尝试实现一个类似绘画的绘图程序。我有两个std::列表,其中包含形状的共享内容。一个是“Undo”链表,另一个是“Redo”。在调用Shape shared_ptr上的reset之前,请通过push_back将共享_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;
}
当给出撤销命令时,我抓取撤销链表后面的共享_ptr并将其移动到重做链表。然后,将m_GraphicsImage清除为白色,最后尝试删除撤消列表,重新绘制所有内容

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;
}
LRESULT CMainFrame::OnUndo(WORD/*wNotifyCode*/,WORD/*wID*/,HWND/*hWndCtl*/,BOOL&/*bHandled*/)
{
m_view.Redo.push_back(m_view.Undo.back());//获取撤消的第一个元素
m_view.m_GraphicsImage.Clear(255);//清除电路板
对于(std::list::iterator it=m_view.Undo.end();it!=m_view.Undo.begin();it--)
{
它->get()->绘图(m_view.m_GraphicsImage);
}
返回0;
}

我一直得到列表迭代器不可延迟…我只是试图创建一个简单的撤消和重做

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

for(std::list<std::shared_ptr<Shape>>::iterator it = m_view.Undo.end();
由于您有可用的c++11功能(
std::shared_ptr
),您可以使用
auto
来推断
迭代器类型,而不是显式键入它:

for (auto i(l.rbegin()); i != l.rend(); i++)
{
}

draw.exe
当前正在执行吗?它在没有for循环的情况下工作正常。是的,它是@hmjd。。。我的迭代器使其不可编译,但如果
.exe
正在运行,则它不可写。停止
.exe
然后重新生成。如何停止.exe@hmjd。我忘了提。这使用了WTL。在任务管理器中找到它并终止它。如果我开始并画了3行以上的线,它将去掉所有三行…如何修复此问题?错误C2440:“初始化”:无法使用1>[1>将“std::reverse\u iterator”转换为“std::\u List\u iterator”1>1>这就是我在尝试反向操作时得到的结果。这些问题是独立的,需要更多的细节来回答,而不是合理地加入到评论中。这个答案是正确的(请记住更改迭代器
i
的类型,如图所示)。这是可行的……但是,如果我画两行并执行撤消操作,怎么会删除两行而不是一行呢
for (auto i(l.rbegin()); i != l.rend(); i++)
{
}