关于智能指针,一般有两种常用的策略,参考:智能指针;有一篇原创的智能指针写得不错:一个智能实现的改进。
关于对象工厂,看到一篇写的不错的博文:泛化对象工厂简述。
在 ITK 中将智能指针与对象工厂结合。除少部分非常小的类之外,其它类都继承自 LightObject 或者 Object(其中,Object 也继承自 LightObject)。LightObjec 是 ITK 中最基层的轻量极类,它提供了增加/减少引用计数(Register()/UnRegister())以及打印对象信息(Print())的方法。ITK 中每个类都提供如下标准定义与函数:
typedef classname Self; //表示自身
typedef parentClass Superclass; //表示父类;LightObject 是最顶基类,无此项
typedef SmartPointer<classname> Pointer; //将该对象的指针包装成智能指针,供用户使用。
typedef SmartPointer<const classname> ConstPointer; //const SmartPointer
static Pointer New(); //除了 LightObject 以外,其余类都是以宏定义 itkNewMacro(Self); 自动生成。
ITK中,用户创建对象实例还是通过 new 操作符,而是以统一的格式:ClassName::Pointer pclass = ClassName::New(); 即可得到指向该类实例对象的智能指针 pclass。其中,New() 通过使用对象工厂创建对象实例。因为智能指针的构造函数是 public 的,所以如上语句得到的智能指针是在“栈”上创建的,而其指向的对象实例则是在“堆”上创建的,所以当智能指针离开作用域时,就会自动析构。此时并不直接删除其所指向的对象,而是减少其引用计数,并且判断引用计数是否为 0,如果为 0 才删除。用户操作得到的智能指针,无论是进行拷贝、还是赋值都不会创建该对象的副本,而是增加该对象的引用计数,这样便实现了指针指向的对象的共享。
对象工厂使得用户能够在运行时进行版本替换,程序中我们进行了演示。
下面给出 ITK 中智能指针(SmartPointer)、以及对象工厂(ObjectFactory)的代码,这里的代码基本都是直接来自 ITK 源码,作了适当的裁减,里面做了比较详细的注释,其实现非常简洁漂亮,很值得借鉴。对象工厂部分比较麻烦,需要仔细研究。
1.几个宏,用于在类中生成统一的 New()、CreateAnother()、GetNa