文档章节

Conversion Operators in OpenCascade

eryar
 eryar
发布于 2014/11/23 12:41
字数 1290
阅读 26
收藏 0

Conversion Operators in OpenCascade

eryar@163.com

Abstract. C++ lets us redefine the meaning of the operators when applied to objects. It also lets us define conversion operations for class types. Class-type conversions are used like the built-in conversions to implicitly convert an object of one type to another type when needed. A conversion operator provides a way for you to define how an object can be converted automatically to a different type. The paper gives some conversion operators examples in OpenCascade. 

Key words. OpenCascade, Conversion Operators, Operator overloading

1. Introduction

C++允许我们重新定义操作符用于类类型对象时的含义。如果需要,可以像内置转换那样使用类类型转换,将一个类型对象隐式转换到另一类型。如在OpenCascade中经常看到如下类似的代码:

TopoDS_Shape theSphere  =  BRepPrimAPI_MakeSphere( 1.0 );

其中,BRepPrimAPI_MakeSphere也是一个类,直接赋值给了另一个类TopoDS_Shape的对象theSphere。第一次这么来用的时候有些困惑,不知道你有没有这样的疑问,不管你有没有,反正我是有的(Just kidding)。后来才知道,这就是一种重载方式,重载了类型转换操作符(Conversion Operator)。 

使用类型转换操作符在将一种类型转换到另一种类型时,感觉自然。当类较多且经常需要进行类型之间的转换时,定义类型转换操作符还是很方便的。本文结合OpenCascade程序来体验使用类型转换操作符带来的便利。

2. Conversion Operators

转换操作符(Conversion Operators)提供了从一种对象类型自动转换到另一种类型的方式。一个经典例子就是自定义字符串类,但是可以将这个自定义的字符串类当作函数参数传给const char*类型的函数,如标准C中的一些函数:strcmp(), strlen()。示例程序如下所示: 

class MyString
{ public:
    MyString(const char* string); // convert MyString to a C-style string. operator const char*() { return mBuffer; } private: char* mBuffer; int mLength;
}; // MyString objects get automatically converted to const char* MyString mystr("Haggis"); int same = strcmp(mystr, "Edible"); int len = strlen(mystr);

转换操作符是一种特殊的类成员函数。它定义将类类型值转换为其他类型值的转换。转换操作符在类定义体内声明,在关键字operator之后跟着转换的目标类型。转换操作符的通用形式为:

operator  type(); 

转换函数必须是成员函数,不能指定返回类型,且形参表必须为空。因为转换的目标类型已经出现在转换操作符中了,所以就不需要重复定义返回值类型了。 

3. Conversion Operators in OpenCascade

OpenCascade中很多地方用到了转换操作符,如将生成的基本实体转换成其他拓朴类型时就用到了转换操作符,程序代码如下所示: 

/* *    Copyright (c) 2014 eryar All Rights Reserved.
*
*           File : Main.cpp
*         Author : eryar@163.com
*           Date : 2014-04-12 18:02
*        Version : V1.0
*
*    Description : Learn Conversion Operators in OpenCascade.
*
*      Key words : OpenCascade, Conversion Operators
* */ #define WNT #include <BRepPrimAPI_MakeSphere.hxx> #pragma comment(lib, "TKernel.lib") #pragma comment(lib, "TKMath.lib") #pragma comment(lib, "TKBRep.lib") #pragma comment(lib, "TKPrim.lib") #pragma comment(lib, "TKTopAlgo.lib") void TestConversionOperators(void)
{
    TopoDS_Shape theSphereShape = BRepPrimAPI_MakeSphere(1.0);
    TopoDS_Solid theSphereSolid = BRepPrimAPI_MakeSphere(1.0);
    TopoDS_Shell theSphereShell = BRepPrimAPI_MakeSphere(1.0);
    TopoDS_Face theSphereFace = BRepPrimAPI_MakeSphere(1.0); // error C2440: 'initializing' : cannot convert // from 'BRepPrimAPI_MakeSphere' to 'TopoDS_Wire' //TopoDS_Wire theSphereWire = BRepPrimAPI_MakeSphere(1.0); } int main(int argc, char* argv[])
{
    TestConversionOperators(); return 0;
}

如上代码所示,可以将类BRepPrimAPI_MakeSphere自动转换成TopoDS_Shape, TopoDS_Solid, TopoDS_Shell, TopoDS_Face,但是不能自动转换成TopoDS_Wire。这是因为在其父类BRepPrimAPI_MakeOneAxis中定义这些转换操作符,代码如下所示: 

//! The abstract class MakeOneAxis is the root class of <br> //! algorithms used to construct rotational primitives. <br> class BRepPrimAPI_MakeOneAxis  : public BRepBuilderAPI_MakeShape { public:

  DEFINE_STANDARD_ALLOC //! The inherited commands should provide the algorithm. <br> //!          Returned as a pointer. <br> Standard_EXPORT virtual Standard_Address OneAxis()  = 0; //! Stores the solid in myShape. <br> Standard_EXPORT virtual void Build() ; //! Returns the lateral face of the rotational primitive. <br> //! <br> Standard_EXPORT const TopoDS_Face& Face() ;
Standard_EXPORT operator TopoDS_Face(); //! Returns the constructed rotational primitive as a shell. <br> Standard_EXPORT const TopoDS_Shell& Shell() ;
Standard_EXPORT operator TopoDS_Shell(); //! Returns the constructed rotational primitive as a solid. <br> Standard_EXPORT const TopoDS_Solid& Solid() ;
Standard_EXPORT operator TopoDS_Solid(); protected: private:
};

由上述代码可知,当将BRepPrimAPI_MakeSphere赋值给TopoDS_Shape时,会调用operator TopoDS_Shape()转换操作符的转换函数;当赋值给TopoDS_Shell时,会调用operator TopoDS_Shell()转换函数,等等。未定义的转换类型是不允许自动转换的,如TopoDS_Wire。 

使用这些转换操作符使不同类型之间的类型转换很自然直观,看上去就像调用了一个函数。 

类型之间的转换当然还有其他方法,如给转换的目标类型增加一个构造函数来实现。但是使用构造函数来转换不能转换成基本类型,如int, double等;还有个不足之处就是要修改转换目标类的声明文件来增加一个构造函数。没有转换操作符来得自然,方便。 

4. Conclusion

当需要在不同类型之间进行类型转换时,可以使用转换操作符(Conversion Operators)。使用转换操作符的方式别其他方法要简单直观。 

由于OpenCascade中类型比较多,且经常需要要不同类型之间进行转换操作,所以将一些常用的转换定义成转换操作符还是很方便的。 

5. References

1. Bjarne Stroustrup. The C++ programming language. Higher Education Press. 2009 

2. Stanley B. Lippman, Josee Lajoie, Barbara E. Moo. C++ Primer. Addison Wesley. 2005 

3. Martin Reddy. API Design for C++. Morgan Kaufmann. 2011

© 著作权归作者所有

上一篇: OpenCASCADE Quaternion
下一篇: OpenNURBS 3DM Viewer
eryar
粉丝 22
博文 127
码字总数 227012
作品 0
武汉
私信 提问
FreeCAD 0.16 发布,开源 CAD/CAE 工具

FreeCAD 0.16 发布了,FreeCAD是一个基于OpenCASCADE的开源CAD/CAE工具。 OpenCASCADE是一套开源的CAD/CAM/CAE几何模型核心,来自法国Matra Datavision公司,是著名的CAD软件EUCLID的开发平台...

oschina
2016/04/21
3K
2
Building OpenCascade on Windows with Visual Studio

Building OpenCascade on Windows with Visual Studio eryar@163.com 摘要Abstract:详细说明OpenCascade的编译配置过程,希望对你编译OpenCascacde有所帮助。本文内容来自OCCT的Overview文档...

eryar
2013/09/23
518
0
OpenCASCADE Make Primitives-Box

OpenCASCADE Make Primitives-Box eryar@163.com Abstract. By making a simple box to demonstrate the BRep data structure of the OpenCASCADE. The construction method is different fr......

eryar
2014/11/23
242
0
如何将openCASCADE和c++结合起来,哪位牛人能不能给我指点指点啊.

如何将openCASCADE和c++结合起来,哪位牛人能不能给我指点指点啊.我现在正想用openCASCADE和c++结合起来做一个像cad软件的东西。

chenchenxixi
2012/07/09
1K
2
FreeCAD 0.17Pre 发布,开源 CAD/CAE 工具

FreeCAD 0.17Pre 发布了。 FreeCAD是一个基于OpenCASCADE的开源CAD/CAE工具。 OpenCASCADE是一套开源的CAD/CAM/CAE几何模型核心,来自法国Matra Datavision公司,是著名的CAD软件EUCLID的开发...

达尔文
2016/10/10
2.3K
3

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
6
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部