gpt4 book ai didi

c++ - 使用 shared_ptr 列表撤消/重做

转载 作者:行者123 更新时间:2023-11-28 03:20:12 25 4
gpt4 key购买 nike

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

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 清除为白色,最后尝试遍历撤消列表,重新绘制所有内容。

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;
}

我不断收到列表迭代器不可递延....我只是想创建一个简单的撤消和重做

最佳答案

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

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

来自list::end()引用页:

Returns an iterator to the element following the last element of the container. This element acts as a placeholder; attempting to access it results in undefined behavior.

使用reverse_iteratorsrbegin()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++)
{
}

关于c++ - 使用 shared_ptr 列表撤消/重做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15677353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com