- 实现原理
FreeCAD中有两套智能指针,一个是OCC的智能指针handle,另一个是自己定义的智能指针Reference,两种智能指针都是通过引用计数方式管理指针。
1.1 OCC智能指针handle
OCC在基础类包中定义了一个模板类handle,该类包含一个私有变量:
这个变量就是handle管理的实体指针,handle类重载了*、->、==等运算符,用户可以直接通过handle使用entity的公有方法和属性。Standard_Transient类中有个整数变量用于引用计数,如图所示。
为了支持在多线程下使用,引用计数通过微软提供的专用于数值锁定计算的API函数InterlockedIncrement和InterlockedDecrement来实现,如图所示。
只有继承Standard_Transient的类,才可以使用handle智能指针。
1.2 handle的使用
OCC所有继承于Standard_Transient的类,都可以使用handle智能指针。OCC是否使用handle提供了几点建议:
- 对象在应用程序中生存周期长且需要多次引用,最好用handle操作对象;
- 对象在算法中使用,生存周期有限,最好直接操作对象;
- 对于像全局变量这种创建一次,但在应用程序全生命周期都存在的对象,最好用handle操作对象。
为了方便使用handle操作对象,OCC定义了一个Handle()宏,如图所示。
这样就可以直接通过宏来使用handle。例如:
另外,OCC许多类还定义了一个带Handle_前缀的类,例如Handle_Geom_Line,它使用通过宏定义一个handle的子类,方便直接使用handle,如图所示。
- 3 FreeCAD智能指针Reference
FreeCAD自定义的Reference智能指针使用Handled类实现引用计数,Handle里面使用一个_lRefCount变量完成计数,该变量是QT实现的能进行原子操作的类型,因此能够保证多线程下计数的安全性。所有需要使用Reference机制的类必须直接或间接继承Handle类。
2.使用情况
FreeCAD中OCC相关的对象使用OCC的handle指针,FreeCAD自定义的Reference指针主要使用在获取系统或用户参数的对象中,如下图所示:
3.总结
FreeCAD使用两套智能指针,OCC的对象使用OCC的智能指针,FreeCAD参数类使用自定义的Reference指针,它们的实现机制大同小异,但其使用比较规范,值得学习。