撤销/重做使用列表的shared_ptr
Undo/Redo using lists of shared_ptr
我想实现一个绘图程序有点像油漆。我有两个std::列表,其中包含shared_ptrs到形状。一个是"撤销"链表,另一个是"重做"链表。在我调用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;
}
我一直得到列表迭代器不可延迟....我只是想创建一个简单的撤销和重做
对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++)
{
}
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理