===== 定义数据管理类 ===== XT中数据对象的管理通过XManager实现。每个对象管理类拥有唯一的类型标识,这个类型标识对外是字符串(通过ctypeString()访问,字符串长度应小于16),对于内部使用则是一个动态生成的整数标识(通过ctype()访问),它按照注册的顺序从1开始自动赋给对象管理类(对于非常通用的数据对象管理器,也可以设置一个不大于256的固定整数标识)。为了避免内存碎片化,XManager开辟了内存池用于为数据对象分配内存,为了提高访问性能,使用优化的散列技术构建数据对象的索引,使得可以在常数时间内访问特定对象。管理类的定义应在定义数据对象之前完成。数据对象管理类从XManager类继承,它最主要的任务有以下几个: * 注册管理类; * 注册数据对象; * 创建数据对象; * 销毁数据对象; * 提供高效的访问API; 此外,XManager还提供了多个接口API以支持XT框架的若干特性。 注册管理类的目的是为了注册数据对象。在构造管理类时,需要指定domainType,一般的,首先通过头文件中的宏声明静态入口(静态声明保证了管理类在被构造对象之前已经获得注册): DECLARE_CMANAGER(MGR) 然后在实现代码中通过下列宏预先指定或生成管理类的类型: REGISTER_CMANAGER(MGR, typeSTR, typeID) 其中MGR是管理类,typeSTR是类型字符串,typeID是整数类型ID,typeSTR不得与已注册的字符串重复并且长度小于16,当需要为MGR自动获取类型ID时,将typeID设置为0即可,否则将按照typeID的值赋给MGR。\\ 一般的,管理器的类型字符串格式可参考给定D[UserCode][DomainName],以大写字母D开头(Domain),其中UserCode为3个字母的用户缩写码,在用户定制的场合使用,是可选项,DomainName是能表达管理对象类型的有意义的字符串,整体长度应小于16个字符, 下面是最简单的对象管理类声明方式: class TestManager : public XManager { DECLARE_CMANAGER(TestManager) public: TestManager(); ~TestManager(); } 在构造函数中需要指定管理类类型: REGISTER_CMANAGER(TestManager, "DTEST", 0) TestManager::TestManager():XManager(TestManager::ctype(),32,NULL,MEG) { } 其中使用了XManager的构造函数: XManager(TypeID domainType, int initHashSize, XMemPool * memPool, int defaultMemSize); domainType即管理类的类型,通过调用类的静态函数获得;initHashSize是预估的初始对象个数,用来设置索引对象的散列;memPool是用来给数据对象分配内存的内存池;defaultMemSize指定了数据对象内存池的大小,默认情况下为1M的内存空间。 ===== 当需要支持Undo/Redo时 =====