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

eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

Conversion Operators in OpenCascade

Posted on 2014-04-12 19:21 eryar 閱讀(2442) 評(píng)論(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++允許我們重新定義操作符用于類類型對(duì)象時(shí)的含義。如果需要,可以像內(nèi)置轉(zhuǎn)換那樣使用類類型轉(zhuǎn)換,將一個(gè)類型對(duì)象隱式轉(zhuǎn)換到另一類型。如在OpenCascade中經(jīng)常看到如下類似的代碼:

TopoDS_Shape theSphere = BRepPrimAPI_MakeSphere(1.0);

其中,BRepPrimAPI_MakeSphere也是一個(gè)類,直接賦值給了另一個(gè)類TopoDS_Shape的對(duì)象theSphere。第一次這么來用的時(shí)候有些困惑,不知道你有沒有這樣的疑問,不管你有沒有,反正我是有的(Just kidding)。后來才知道,這就是一種重載方式,重載了類型轉(zhuǎn)換操作符(Conversion Operator)。

使用類型轉(zhuǎn)換操作符在將一種類型轉(zhuǎn)換到另一種類型時(shí),感覺自然。當(dāng)類較多且經(jīng)常需要進(jìn)行類型之間的轉(zhuǎn)換時(shí),定義類型轉(zhuǎn)換操作符還是很方便的。本文結(jié)合OpenCascade程序來體驗(yàn)使用類型轉(zhuǎn)換操作符帶來的便利。


2. Conversion Operators

轉(zhuǎn)換操作符(Conversion Operators)提供了從一種對(duì)象類型自動(dòng)轉(zhuǎn)換到另一種類型的方式。一個(gè)經(jīng)典例子就是自定義字符串類,但是可以將這個(gè)自定義的字符串類當(dāng)作函數(shù)參數(shù)傳給const char*類型的函數(shù),如標(biāo)準(zhǔn)C中的一些函數(shù):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);

轉(zhuǎn)換操作符是一種特殊的類成員函數(shù)。它定義將類類型值轉(zhuǎn)換為其他類型值的轉(zhuǎn)換。轉(zhuǎn)換操作符在類定義體內(nèi)聲明,在關(guān)鍵字operator之后跟著轉(zhuǎn)換的目標(biāo)類型。轉(zhuǎn)換操作符的通用形式為:

operator type(); 

轉(zhuǎn)換函數(shù)必須是成員函數(shù),不能指定返回類型,且形參表必須為空。因?yàn)檗D(zhuǎn)換的目標(biāo)類型已經(jīng)出現(xiàn)在轉(zhuǎn)換操作符中了,所以就不需要重復(fù)定義返回值類型了。


3. Conversion Operators in OpenCascade

OpenCascade中很多地方用到了轉(zhuǎn)換操作符,如將生成的基本實(shí)體轉(zhuǎn)換成其他拓樸類型時(shí)就用到了轉(zhuǎn)換操作符,程序代碼如下所示:

 

/*
*    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自動(dòng)轉(zhuǎn)換成TopoDS_Shape, TopoDS_Solid, TopoDS_Shell, TopoDS_Face,但是不能自動(dòng)轉(zhuǎn)換成TopoDS_Wire。這是因?yàn)樵谄涓割怋RepPrimAPI_MakeOneAxis中定義這些轉(zhuǎn)換操作符,代碼如下所示:

 

//! 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:
};

由上述代碼可知,當(dāng)將BRepPrimAPI_MakeSphere賦值給TopoDS_Shape時(shí),會(huì)調(diào)用operator TopoDS_Shape()轉(zhuǎn)換操作符的轉(zhuǎn)換函數(shù);當(dāng)賦值給TopoDS_Shell時(shí),會(huì)調(diào)用operator TopoDS_Shell()轉(zhuǎn)換函數(shù),等等。未定義的轉(zhuǎn)換類型是不允許自動(dòng)轉(zhuǎn)換的,如TopoDS_Wire。

使用這些轉(zhuǎn)換操作符使不同類型之間的類型轉(zhuǎn)換很自然直觀,看上去就像調(diào)用了一個(gè)函數(shù)。

類型之間的轉(zhuǎn)換當(dāng)然還有其他方法,如給轉(zhuǎn)換的目標(biāo)類型增加一個(gè)構(gòu)造函數(shù)來實(shí)現(xiàn)。但是使用構(gòu)造函數(shù)來轉(zhuǎn)換不能轉(zhuǎn)換成基本類型,如int, double等;還有個(gè)不足之處就是要修改轉(zhuǎn)換目標(biāo)類的聲明文件來增加一個(gè)構(gòu)造函數(shù)。沒有轉(zhuǎn)換操作符來得自然,方便。


4. Conclusion

當(dāng)需要在不同類型之間進(jìn)行類型轉(zhuǎn)換時(shí),可以使用轉(zhuǎn)換操作符(Conversion Operators)。使用轉(zhuǎn)換操作符的方式別其他方法要簡(jiǎn)單直觀。

由于OpenCascade中類型比較多,且經(jīng)常需要要不同類型之間進(jìn)行轉(zhuǎn)換操作,所以將一些常用的轉(zhuǎn)換定義成轉(zhuǎn)換操作符還是很方便的。


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>
            国产精品久久二区| 亚洲一区二区综合| 亚洲欧美国产毛片在线| 亚洲午夜激情| 午夜亚洲福利| 噜噜噜噜噜久久久久久91| 欧美国产高潮xxxx1819| 最新国产成人av网站网址麻豆 | 亚洲欧美中文字幕| 欧美一区二区三区日韩视频| 欧美专区在线播放| 欧美不卡在线视频| 国产精品免费网站在线观看| 国内一区二区三区| 日韩亚洲一区二区| 欧美自拍偷拍午夜视频| 亚洲人成在线免费观看| 校园激情久久| 亚洲高清视频一区| 亚洲福利视频网站| 久久精品国产99精品国产亚洲性色| 国产欧美va欧美不卡在线| 国产精品99一区二区| 欧美精品一区二区三区蜜臀| 能在线观看的日韩av| 免费国产一区二区| 亚洲成人直播| 亚洲素人在线| 久久av一区二区三区| 欧美成人午夜激情| 国产亚洲成av人在线观看导航| 亚洲国产一二三| 久久成人精品一区二区三区| 亚洲福利视频一区| 久久精品亚洲| 国产嫩草一区二区三区在线观看 | 亚洲韩国日本中文字幕| 亚洲一级在线| 欧美激情免费观看| **欧美日韩vr在线| 久久久精品一品道一区| 亚洲午夜精品久久| 欧美日韩综合另类| 亚洲毛片在线观看.| 裸体一区二区三区| 午夜免费电影一区在线观看| 欧美午夜剧场| 中文久久乱码一区二区| 最新国产成人在线观看| 免费亚洲电影在线| 亚洲国内自拍| 欧美国产在线视频| 麻豆精品网站| 亚洲人成7777| 亚洲人成精品久久久久| 欧美精品99| 一区二区欧美国产| 亚洲精品乱码久久久久久按摩观| 免费久久精品视频| 亚洲精品视频在线| 91久久久在线| 欧美日韩亚洲网| 在线亚洲欧美| 欧美中文字幕在线| 亚洲日本理论电影| 欧美高清自拍一区| 亚洲精品乱码久久久久久日本蜜臀 | 美女999久久久精品视频| 国内自拍一区| 你懂的视频一区二区| 久久久久久久精| 亚洲激情成人网| 亚洲国产精品999| 欧美日韩国产一区| 亚洲欧美综合一区| 欧美一区二区三区精品| 伊人影院久久| 亚洲黄一区二区三区| 欧美午夜三级| 久久亚洲午夜电影| 欧美激情中文字幕乱码免费| 在线中文字幕不卡| 性久久久久久久久久久久| 激情视频一区二区| 亚洲日本中文字幕| 国产酒店精品激情| 欧美成人激情视频| 欧美三区美女| 久久免费99精品久久久久久| 欧美成黄导航| 欧美在线视频播放| 欧美福利网址| 久久大综合网| 欧美日韩国产另类不卡| 久久精品免费看| 欧美精品一区在线播放| 久久精品五月婷婷| 欧美精品在线观看91| 久久高清福利视频| 欧美女主播在线| 久久综合伊人77777蜜臀| 欧美国产日韩a欧美在线观看| 亚洲在线视频免费观看| 麻豆国产精品va在线观看不卡| 亚洲伊人观看| 欧美激情一级片一区二区| 午夜精品久久久久久| 你懂的视频欧美| 看欧美日韩国产| 国产精品青草久久| 亚洲精品欧美日韩专区| 精品成人一区二区三区四区| 中日韩男男gay无套| 亚洲欧洲日韩综合二区| 欧美在线视频免费| 香蕉久久夜色| 欧美视频精品在线| 亚洲欧洲日本国产| 亚洲国产精品va在线观看黑人| 亚洲最新视频在线| 亚洲午夜影视影院在线观看| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲欧美日韩高清| 亚洲欧美一区二区在线观看| 欧美激情性爽国产精品17p| 免费成人毛片| 在线国产日韩| 久久综合网色—综合色88| 久久久久久久成人| 国产亚洲免费的视频看| 亚洲永久精品国产| 亚洲在线第一页| 国产精品国产a| 99re66热这里只有精品3直播| 亚洲日本久久| 欧美精品激情在线| 亚洲精品视频在线观看免费| 亚洲人成在线观看| 欧美激情视频免费观看| 亚洲国产毛片完整版 | 国语自产精品视频在线看| 午夜精品久久久久久久久久久久| 香蕉久久一区二区不卡无毒影院| 国产精品高潮呻吟久久| 亚洲一区二区三区激情| 欧美一区二区三区在| 国产一区观看| 蜜臀久久久99精品久久久久久| 欧美国产高清| 亚洲天堂网站在线观看视频| 国产精品久久久久久久久久免费 | 亚洲一区二区三区三| 欧美一区二区视频在线观看2020 | 久久亚洲春色中文字幕久久久 | 在线亚洲高清视频| 午夜精品一区二区三区电影天堂| 国产精品免费aⅴ片在线观看| 在线视频亚洲一区| 久久美女性网| 亚洲美女尤物影院| 国产精品久久久免费| 欧美中文字幕在线观看| 欧美xart系列高清| 亚洲视频免费观看| 国语自产偷拍精品视频偷| 免费在线观看日韩欧美| 一本大道久久a久久精品综合| 欧美在线日韩| 亚洲欧洲精品一区二区三区| 国产精品成人一区二区三区夜夜夜 | 在线视频亚洲| 亚洲人www| 国产精品女主播在线观看| 欧美专区日韩视频| 亚洲欧洲日本一区二区三区| 欧美在线观看你懂的| 最新精品在线| 国产亚洲精品久久久久久| 欧美激情1区2区| 欧美亚洲系列| 99国产精品久久久久久久成人热| 久久精品亚洲乱码伦伦中文| 亚洲最新视频在线| 黄色av成人| 国产欧美激情| 欧美日韩亚洲一区二区三区四区| 校园春色国产精品| 亚洲视频www| 亚洲电影免费观看高清| 久久久综合免费视频| 亚洲综合色噜噜狠狠| 91久久久在线| 红桃视频欧美| 国产综合久久久久久| 欧美午夜宅男影院在线观看| 免费高清在线一区| 久久久国产91| 久久国产精品一区二区| 亚洲午夜性刺激影院| 日韩一级大片在线|