青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

Conversion Operators in OpenCascade

Posted on 2014-04-12 19:21 eryar 閱讀(2467) 評論(0)  編輯 收藏 引用 所屬分類: 2.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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产你懂的| 一区二区三区毛片| 久久久夜夜夜| 韩国精品一区二区三区| 久久中文精品| 久久综合给合久久狠狠狠97色69| 久久久久久精| 亚洲福利视频二区| 亚洲经典一区| 欧美性感一类影片在线播放| 亚洲伊人观看| 亚洲国产网站| 国产精品劲爆视频| 久久超碰97人人做人人爱| 久久疯狂做爰流白浆xx| 91久久精品国产91久久性色| 日韩视频一区二区在线观看| 国产精品视频一二| 欧美sm极限捆绑bd| 欧美日韩综合不卡| 91久久精品国产91久久性色tv| 欧美一区=区| 99精品久久久| 欧美激情亚洲激情| 欧美在线视频日韩| 欧美成人dvd在线视频| 在线不卡亚洲| 一区二区日韩伦理片| 很黄很黄激情成人| 在线视频精品一| 在线观看亚洲视频啊啊啊啊| 日韩视频专区| 亚洲高清不卡在线观看| 亚洲午夜免费福利视频| 亚洲欧洲偷拍精品| 亚洲一级网站| 亚洲乱码国产乱码精品精可以看 | 国产精品亚洲一区| 蜜月aⅴ免费一区二区三区| 欧美视频福利| 亚洲国产午夜| 红桃视频国产精品| 欧美阿v一级看视频| 国产精品国产a级| 91久久精品国产| 欧美日韩精品一本二本三本| 久久综合免费视频影院| 国产精品美女久久久| 亚洲国产精品成人久久综合一区| 欧美va亚洲va国产综合| 久久久久久久久久看片| 国产精品激情| 久久九九热re6这里有精品| 欧美日韩在线播| 亚洲黄色成人久久久| 亚洲第一福利社区| 久久久91精品国产一区二区精品| 亚洲国产精品一区二区第四页av| 欧美福利小视频| 伊人久久亚洲热| 久久久欧美精品| 久久人人精品| 亚洲第一页中文字幕| 久久精品中文字幕免费mv| 久久久久久91香蕉国产| 国产喷白浆一区二区三区| 亚洲自拍啪啪| 久久九九国产| 狠狠色丁香久久婷婷综合_中| 亚洲第一精品夜夜躁人人躁| 亚洲高清久久| 免费在线观看日韩欧美| 欧美激情性爽国产精品17p| 亚洲激情电影在线| 欧美激情精品久久久久久免费印度 | 亚洲男人第一网站| 亚洲欧美日韩成人| 久久资源在线| 最新日韩欧美| 亚洲视频二区| 国产精品免费看片| 91久久久在线| 国产综合一区二区| 久久嫩草精品久久久精品| 欧美激情国产日韩| 国产精品一区在线观看| 亚洲国产高清自拍| 韩国美女久久| 欧美a级片网| 亚洲视频在线观看视频| 亚洲精品久久久久久久久久久久 | 老色鬼久久亚洲一区二区| 黄色小说综合网站| 亚洲在线免费观看| 久久午夜精品一区二区| 国产精品高潮呻吟| 久久精品99国产精品| 亚洲午夜精品视频| 国产亚洲成av人在线观看导航| 亚洲日本欧美天堂| 久久本道综合色狠狠五月| 欧美日韩一区精品| 亚洲国产婷婷香蕉久久久久久99 | 韩国av一区二区三区在线观看| 一本综合精品| 老司机精品视频一区二区三区| 国产精品国产精品| 久久夜色精品国产| 亚洲午夜精品一区二区| 欧美大成色www永久网站婷| 亚洲欧美日韩国产一区| 亚洲第一精品久久忘忧草社区| 久久国产精品毛片| 一区二区精品在线| 欧美国产综合一区二区| 香蕉久久国产| 一区二区三区产品免费精品久久75| 欧美福利网址| 久久国产黑丝| 欧美高清在线播放| 久久久av毛片精品| 亚洲永久免费av| 日韩一级欧洲| 伊人精品成人久久综合软件| 国产精品入口麻豆原神| 欧美精品久久一区二区| 久久一区二区精品| 91久久精品美女| 欧美成人精品h版在线观看| 久久精品视频免费| 亚洲国产精品久久久久秋霞蜜臀 | 欧美亚洲视频一区二区| 在线综合亚洲| 久久精品国产77777蜜臀| 精品1区2区3区4区| 国产又爽又黄的激情精品视频| 久久久久青草大香线综合精品| 亚洲第一在线视频| 欧美韩日高清| 欧美国产激情| 亚洲国产精品精华液2区45| 一区二区三区日韩在线观看| 国产精品毛片| 国产精品xxxav免费视频| 欧美日韩在线播放一区| 欧美日韩精品是欧美日韩精品| 午夜精品国产更新| 亚洲午夜影视影院在线观看| 亚洲网站视频| 欧美激情按摩在线| 91久久国产精品91久久性色| 亚洲国产成人久久综合| 亚洲激情视频网| 日韩午夜视频在线观看| 亚洲视频精选在线| 亚洲欧美视频在线| 久久久久国产精品人| 你懂的成人av| 欧美日韩网址| 国产欧美日韩一区二区三区在线 | 久久国产一区二区三区| 久久精品亚洲一区| 免费欧美日韩| 欧美日韩高清一区| 国产欧美va欧美va香蕉在| 黄色综合网站| 亚洲精品在线免费| 亚洲欧美视频在线| 久久夜色精品国产噜噜av| 亚洲一区二区视频| 亚洲美女少妇无套啪啪呻吟| 亚洲视频在线免费观看| 欧美在线视频在线播放完整版免费观看| 亚洲精品欧美专区| 亚洲欧美激情精品一区二区| 久久精品噜噜噜成人av农村| 欧美成va人片在线观看| 99国产精品99久久久久久粉嫩| 欧美a级片网站| 一本久道久久综合中文字幕| 性久久久久久久久| 亚洲欧美日韩精品久久奇米色影视| 亚洲日本电影在线| 午夜欧美不卡精品aaaaa| 欧美va天堂在线| 国产情侣久久| 亚洲视频观看| 欧美本精品男人aⅴ天堂| 亚洲视频久久| 欧美激情一区二区三区在线视频| 免费视频久久| 国产一区二区电影在线观看| 日韩视频在线你懂得| 久久久精品国产免大香伊 | 国产精品视屏| 亚洲精品小视频| 久久亚裔精品欧美| 亚洲视频在线观看免费| 亚洲专区在线视频| 欧美精品综合|