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

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) 評論(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>
            久久亚洲欧洲| 国产精品三上| 一级成人国产| 日韩视频在线免费| 亚洲精品一二三| 中文国产成人精品| 亚洲欧美日韩精品在线| 欧美专区中文字幕| 久久婷婷综合激情| 欧美日韩国产在线播放| 国产精品啊v在线| 国产午夜精品视频| 亚洲国产精品ⅴa在线观看| 亚洲国产精品日韩| 尤物yw午夜国产精品视频| 国产精品最新自拍| 激情六月综合| 日韩视频中文| 久久aⅴ国产紧身牛仔裤| 久久亚洲精品网站| 亚洲免费久久| 久久精品国产综合| 欧美视频在线免费看| 国产三级精品在线不卡| 136国产福利精品导航网址| 在线天堂一区av电影| 久久香蕉国产线看观看av| 亚洲国产精品成人va在线观看| 9久草视频在线视频精品| 久久都是精品| 国产精品视频久久久| 99天天综合性| 久久亚洲精品伦理| 亚洲制服少妇| 欧美日韩国产一区| 在线日本成人| 久久福利电影| 夜夜嗨av一区二区三区网站四季av| 欧美一区三区二区在线观看| 欧美日韩在线视频一区二区| 在线成人www免费观看视频| 亚洲永久精品大片| 亚洲精品乱码久久久久久蜜桃麻豆| 香蕉国产精品偷在线观看不卡| 欧美激情1区2区| 在线观看欧美黄色| 久久久国产精品一区| 亚洲一区二区三区高清| 欧美精品在线免费播放| 亚洲国产精彩中文乱码av在线播放| 欧美一区二区三区在线| 亚洲最黄网站| 欧美无乱码久久久免费午夜一区| 一本大道av伊人久久综合| 亚洲成色777777在线观看影院| 久久精品一二三区| 黄色精品一区二区| 久久综合色婷婷| 久久精品在线观看| 国产一区在线视频| 美女视频网站黄色亚洲| 久久精品中文字幕一区二区三区| 国产亚洲高清视频| 久久欧美肥婆一二区| 久久国产精品免费一区| 韩国在线一区| 欧美a一区二区| 狂野欧美激情性xxxx| 91久久久久| 亚洲日本视频| 国产精品免费观看视频| 欧美国产综合视频| 亚洲欧美国产精品桃花| 国产精品区一区二区三区| 亚洲欧美偷拍卡通变态| 亚洲制服av| 精品成人一区二区| 亚洲福利在线视频| 欧美日韩系列| 亚洲女同精品视频| 久久不射网站| 亚洲伦理中文字幕| 亚洲深夜福利网站| 在线观看国产精品淫| 亚洲国产va精品久久久不卡综合| 欧美日韩第一区| 午夜欧美电影在线观看| 欧美在线一区二区| 亚洲欧洲日本国产| 亚洲午夜在线| 黄色一区二区三区四区| 亚洲区中文字幕| 国产精品青草久久| 欧美国产视频在线| 国产精品狼人久久影院观看方式| 久久亚洲春色中文字幕| 欧美久久在线| 久久久夜夜夜| 欧美日韩一区自拍| 快射av在线播放一区| 欧美视频免费看| 麻豆视频一区二区| 国产精品久久777777毛茸茸| 免费美女久久99| 国产精品视区| 亚洲日本va午夜在线电影| 国产午夜精品久久| 亚洲日韩第九十九页| 国产一区二区三区久久悠悠色av| 亚洲国内自拍| 韩国视频理论视频久久| 亚洲影院污污.| 日韩视频免费大全中文字幕| 久久国产精品久久久久久电车| 亚洲婷婷综合久久一本伊一区| 久久女同互慰一区二区三区| 欧美一区二区三区精品电影| 欧美片在线观看| 欧美黑人多人双交| 韩国精品久久久999| 亚洲欧美电影在线观看| 夜夜爽av福利精品导航 | 亚洲一区二区三区中文字幕| 久久免费午夜影院| 久久精品一区二区| 国产精品久久久久久久久久久久久久| 欧美成熟视频| 在线精品福利| 久久久精品久久久久| 欧美一级淫片aaaaaaa视频| 欧美日韩伦理在线| 亚洲人成高清| 日韩亚洲国产精品| 欧美成人69| 亚洲高清av| 久久在线播放| 黄色国产精品| 久久成人人人人精品欧| 久久九九热re6这里有精品| 国产麻豆综合| 欧美一区网站| 久久精品夜色噜噜亚洲a∨| 国产精品久久午夜夜伦鲁鲁| 日韩图片一区| 亚洲免费在线观看视频| 国产精品免费aⅴ片在线观看| 一卡二卡3卡四卡高清精品视频| 夜夜嗨av一区二区三区网页 | 亚洲一区在线免费| 欧美一区成人| 含羞草久久爱69一区| 免费一级欧美片在线观看| 最新中文字幕一区二区三区| 中文在线资源观看网站视频免费不卡 | 亚洲黑丝在线| 欧美欧美全黄| 一区二区不卡在线视频 午夜欧美不卡'| 一本久久a久久免费精品不卡| 欧美精品综合| 亚洲宅男天堂在线观看无病毒| 久久aⅴ乱码一区二区三区| 狠狠色2019综合网| 欧美丰满少妇xxxbbb| 夜夜爽99久久国产综合精品女不卡| 亚洲午夜久久久久久久久电影院 | 欧美巨乳在线观看| 亚洲天堂激情| 蜜臀av一级做a爰片久久| 亚洲精品日韩激情在线电影| 欧美色123| 久久久精品一品道一区| 亚洲精品久久久久久下一站| 欧美一区二区三区免费视| 亚洲国产福利在线| 国产精品久久久久久久久久久久久久| 久久久久九九九九| 中文精品视频一区二区在线观看| 久久激五月天综合精品| 日韩一级裸体免费视频| 国内成人精品视频| 国产精品xvideos88| 久久综合狠狠综合久久综青草| 日韩特黄影片| 欧美成人a视频| 欧美一区二区三区婷婷月色 | 国产在线精品一区二区夜色| 欧美精彩视频一区二区三区| 午夜伦理片一区| 日韩亚洲不卡在线| 日韩香蕉视频| 欧美伦理在线观看| 久久人人爽人人爽| 亚洲一区二区三区四区中文| 亚洲激情午夜| 免费欧美网站| 久久亚洲国产精品日日av夜夜| 亚洲欧美日韩综合aⅴ视频| 亚洲每日在线| 亚洲激情影视| 亚洲国产91精品在线观看|