网站后台 搜索,网络推广服务,手机网站框架,天津做网站软件实现原理
FreeCAD中有两套智能指针#xff0c;一个是OCC的智能指针handle#xff0c;另一个是自己定义的智能指针Reference#xff0c;两种智能指针都是通过引用计数方式管理指针。 1.1 OCC智能指针handle OCC在基础类包中定义了一个模板类handle#xff0c;该类包含一个私…
实现原理
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指针它们的实现机制大同小异但其使用比较规范值得学习。