#if 0
在前一章中已经成功的封装了三个基本操作成为基本命令,同时也封装了复合操作
成为复合命令,另外对这些基本的命令的使用进行了更进一步的封装,使得客户端编写
的代码更易理解。虽然已经基本上具备了编写撤销和重做的能力,但是使用的时候还是
会因为不能够准确的分配相应的标识号而困扰。因此在本章中对标识号进行系统的讨论
;并给出相应的实现和测试代码。
首先需要知道标识号应当达到的目标:
(1)针对每一种类型自动的分配一个标识号
(2)每一个类型的标识号是独一无二的
(3)标识号可以产生无限多个
(4)标识号应该占用尽可能少的空间
(5)标识号是针对于特定类型的,不应当有针对通用类型的标识号
为了达到上面所提到的各个要求,我采用的类似于Unicode编码的方式,一个单元可
以表达的绝对不用两个单元表达,这里的单元指的是一个long,char等等基本类型,当然
用unsigned long做为单元或用unsigned int作为单元则根据自己的需要而定了。当常用
对象不是很多的时候用小一点的单元就更省空间了;在编码的过程中这个单元的元素用
模板参数表示,可供用户选择。
#endif
#include <limits>
#include <iostream>
#include <string>
//调试用的头文件
namespace pandaxcl{
//标识符是需要针对类型的,这主要是为了提高使用撤销和重做框架的程序的效率而考虑的
template<class ObjectType,class T=long>
class identifier
{
public:
typedef identifier this_type;
typedef std::basic_string<T> represent_type;
typedef T value_type;
typedef typename represent_type::size_type size_type;
identifier(bool New=true)
{ //当参数需要新产生一个标识号的时候生成一个
if(New)_next();
}
identifier(identifier const&id)
{ //拷贝构造函数中将仅仅对表示的数据进行拷贝
if(&id!=this) _rep=id._rep;
}
virtual~identifier()
{
}
//下面的函数使得标识号从指定的初始数据开始重新产生
void restart(const T init=0)
{
_get_rep()=represent_type(1,T(init));
}
//为了方便调试,在这里给出一个输出用的函数
friend std::ostream&operator<<(std::ostream&s,identifier const<
撤销和重做(Undo和Redo)的C++完美实现(5)
最新推荐文章于 2022-09-11 12:49:09 发布
本文档详细介绍了如何使用C++实现撤销和重做的标识号系统,以达到自动分配、唯一性、无限扩展及节省空间等目标。通过模板类`identifier`,利用类似Unicode编码方式,确保标识号的高效管理。代码示例展示了如何生成和使用这些标识号。
摘要由CSDN通过智能技术生成