三九宝宝网宝宝百科宝宝知识

C++技巧:OpenCASCADE智能指针的使用

12月14日 编辑 39baobao.com

[VC++字体通用的类]#include "stdafx.h" #include "font.h" COleFont properties CString COleFont::GetName() { CString result; GetProperty(0x0, VT_BSTR, (void*) return result; } void...+阅读

学习OCC的第一步是要了解其类的结构及组成,比如AIS_InteractiveObject类用来表示一个交互 式图形对象,如果进一步了解会发现其继承关系是:MMgt_TShared->Standard_Transient->PrsMgr_PresentableObject->SelectMgr_SelectableObject->AIS_InteractiveObject。

其实,许多类的基类都是MMgt_TShared,另外,每个类都有一个对应的类,比如 ,对于Standard_Transient类来说,实际使用的是Handle(Standard_Transient)类,不要被括号搞混了,它只不过是个宏定义,也就是类Handle_Standard_Transient.那么OCC为什么这样绕一圈子呢,原因是,在OCC中要避免使用指针,所谓“不使用”,只不过是对它做一层包装,让用户感觉不到使用指针,这层包装就是Handle(类名)的作用。

那么OCC为什么对指针如此避讳呢?

当如果做图形时,如果生成一个类,比如一个直线,如果直接用new的方法,那么每生成一个就占用一片空间,这样会占用很多系统资源。同时降低效率。显然,只是顶点位置不同的直线,如果对它的颜色,线型等都重新生成,那生成一万条直线机器肯定吃不消。一个解决方法就是只拷贝构造函数生成直线,让他不存储数据,而只存储一个指向原来直线数据的指针。这样空间就节省了很多。但问题在于这样两个直线完全联结在了一起。如果修改了其中一个,另一个也跟着变了。同时如果删除了第二个直线,第一个直线实际上数据也删除了,成了悬挂指针。

OCC中Handle的真正作用正是解决这个问题的。在Standard_Transient类中有一个私有变量:Standard_Integer count;它用用计算引用数的,也就是说每生成一个直线,就增加一,每删除一条直线,就减一,除非count等于O了,才真正删除Standard_Transient所占用的空间。考试,大提示这几条直线都共用颜色值,共用同一块空间,直到更改其中一条线的颜色时,才真正分配此直线的颜色值空间。

以下为关联文档:

C++技巧:emacs完美的C++的自动补全1,CVS cedet的最新代码,1.04代码补全很慢。 cvs -z3 -d:pserver:anonymous#cedet.cvs.sourcefe.:/cvsroot/cedet co -P cedet 2,命令行运行 touch `find -name "Makefile"` (注...

解决VC++程序国际化的类,解决乱码问题#include "stdafx.h" #include "global.hpp" Deion: generate an error message int Error(long err, char *fmt, ...) { static char buf[256]; static char buf2[256]; va...

使用VC++6关闭指定窗口标题的程序常常听说有病毒关闭杀毒软件,是枚举窗口标题来实现的,那么内幕是什么呢? 其实只需要数10行代码就可以了。 VC++6.0建立Win32 APPlication,复制下面的代码... #include BOOL CALL...

二级考试C++基础:volatile的使用方法volatile的本意是一般有两种说法--1.“暂态的”;2.“易变的”。 其实Volatile是由于编译器优化所造成的一个Bug而引入的关键字。 int a = 10; int b = a; int c = a; 理论上...

C++中使用断点写调试方法C/C++ code: f9 --- 设置/取消断点 f10 --- 单步执行 f11 --- 比f10的步幅小,f10在函数的调用时,直接跳过,在f11下,会进入函数体! f5 --- 执行到下一个断点! 了解调试,首先要知道"...

c++读写剪贴板代码代码如下: 写: if(OpenClipboard()) { CString str; HANDLE hClip; char *pBuf; EmptyClipboard(); str="879789789"; hClip=GlobalAlloc(GMEM_MOVEABLE,str.GetLength()+1);...

C++实例:sgistlconfigstl_config.h 由于不同的编译环境对标准C++的支持不完全相同,出于移植性的考虑,SGI STL定义了这个文件。它通过条件编译针对不同的编译器作了部分常数设定,对编译器的设定如下:...

c++数据类型及复杂声明推演数据类型 c++程序员已经知道c语言有五种数据类型:void,int,float,double和char: 类型 描述 void 无数据类型 int 整数类型 float 浮点数 double 双精度浮点数 char 字符型 c+...

C++基础:有趣的#define的一个实例看了一下google CoverStory的代码,有一个地方很有意思: These are the various document types used by CoverStory. Included in both Obj-C and plist sources. A little ma...

推荐阅读
图文推荐