Conversion Operators in OpenCascade

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

PDF Version: Conversion Operators in OpenCascade

时间: 2024-11-03 21:42:28

Conversion Operators in OpenCascade的相关文章

OpenCASCADE Outline

OpenCASCADE Outline eryar@163.com      有网友反映blog中关于OpenCASCADE的文章比较杂乱,不太好找,最好能提供一个大纲,这样方便查找.于是决定将这些学习时写的文章整理下,方便对OpenCASCADE的学习理解.其实在http://www.cnblogs.com/opencascade中,已经将文章按目录重新发表了一遍.可以按OpenCASCADE的模块的顺序来学习,也可以挑选自己感兴趣的部分来学习.      由于本人水平所限,文中的错误不妥之处

How to: Define a Conversion Operator [msdn]

because of my project, learned something about VB.NET. and now by chance, find this stuff. it's pretty cool. Visual Studio 2005 Other Versions If you have defined a class or structure, you can define a type conversion operator between the type of you

WCF:使用事务管理状态和错误恢复

目录 状态管理和事务 单调用事务性服务 实例管理和事务 基于会话的服务和 VRM 事务性持久服务 事务性行为 向 IPC 绑定添加上下文 InProcFactory 和事务 编程中的一个根本问题就是错误恢复.发生错误后,应用程序必须自行恢复到产生错误之前的状态. 请考虑这样一个应用程序,它试图执行一项由若干个更小操作组成的操作,这些小操作可能并行发生,而 且每个单独操作的成功或失败都与其他操作无关.任何一个更小操作出现错误,都意味着系统处于不一致 的状态. 以银行业务应用程序为例,该应用程序通过

Visual Studio, GCC, Clang, Intel 对 C++11 特性的支持一览表

距离我上次对C++11支持的不同编译器的比较已经有大半年了.这次我来根据这些预览版的编译器的文档来看下它们是如何堆砌起来的. GCC的下个版本是4.8,以及Clang即将到来的版本是3.3 .如果你使用Visual Studio 2012,你可以安装2012年11月更新支持C++11额外特征的体验版CTP. throwable 翻译于 2天前 0人顶 顶 翻译的不错哦! 我也对V.13.0的Intel C++编译器感到好奇,虽然它还不是预览版并且我也找不到有关它的新特性的信息.我没找到任何有关这

101 LINQ Samples

101 LINQ Samples Restriction Operators Where - Simple 1 Where - Simple 2 Where - Simple 3 Where - Drilldown Where - Indexed Projection Operators Select - Simple 1 Select - Simple 2 Select - Transformation Select - Anonymous Types 1 Select - Anonymous

OpenCASCADE Foundation Classes Collections, Strings and Unit Conversion

OpenCASCADE Foundation Classes Collections, Strings and Unit Conversion OpenCASCADE基础库之集合.字符串和单位转换 一.集合 Collections 1. 概述 Overview 集合Collections包含可处理动态大小的数据类,包括数组.链表.映射等.集合中的类是泛型的,即集合可以保存任何对象数据而不用关心是不是从一个基类派生而来的对象.当使用集合来保存指定的对象时,你必须从指定的类型来实例化.当声明编译后,

Operators and Assignments(2)

Objective 2) Determine the result of applying the boolean equals(Object) method to objects of any combination of the classes java.lang.String java.lang.Boolean and java.lang.Object. The equals method can be considered to perform a deep comparison of

Operators and Assignments(1)

5)Operators and AssignmentsObjective 1)Determine the result of applying any operator including assignment operators and instanceof to operands of any type class scope or accessibility or any combination of these.1.    Unary operators.1.1    Increment

FreeType in OpenCASCADE

FreeType in OpenCASCADE eryar@163.com Abstract. FreeType is required for text display in the 3D viewer. FreeType is a software font engine that is designed to be small, efficient, highly customizable, and portable while capable of producing high-qual