slice的c++映射

1、Slice標識符映射到相同的C++標識符。(儘量不要使用與語言相關的標示符)
2、Slice模塊映射到C++名字空間。
3、Slice基本數據的bool和string映射到C++的bool和std::string,其他均映射到ice的跨平臺數據類型
4、slice枚舉映射到c++的枚舉
5、slice結構映射到c++的同名結構,其成員變量映射成同名的c++成員變量。爲了支持標準庫的集合類型,
   每個結構中擴展了六個操作符函數,分別是==、!=、<、<=、>、>=
6、slice結構可以顯示的映射成c++的類,需要在slice結構定義時加上metadata限制["cpp:class"],這樣
   在生成的c++類定義中除了上述結構信息外,還會多兩個構造函數
7、slice的sequence<>默認映射成std::vector<>。可通過增加額外的metadata改變其默認行爲:
   例如映射成list: ["cpp:include:list"] ["cpp:type:std::list<>"] sequence
   例如映射成deque: ["cpp:include:deque"] ["cpp:type:std::deque<>"] sequence
   
   也可以映射成自定義數據類型:["cpp:include:mytype.h"] ["cpp:type:mytype"] sequence。當然要求自定義類型滿足std容器的基本函數要求
   
   也可以通過["cpp:array"]Ice::ByteSeq映射成std::pair<const Ice::Byte*, const Ice::Byte*>,這種情況主要用於stl的迭代器訪問場景,同時也是高效的
   數據傳輸方式,因爲傳遞指針會減少內存拷貝過程。但是該處的指針不能再操作中持久化,因爲操作完成後該指針指向內存區域即將釋放
   
   也可以通過["cpp:range"]Ice::ByteSeq映射成std::pair<const Ice::ByteSeq::const_iterator, const Ice::ByteSeq::const_iterator>&,當然,該處也不能
   在操作中保存該迭代器,因爲操作結束後蓋迭代器即將失效
8、slice的dictionary<>默認映射成std::map<>
9、Slice常量定義映射到對應的C++常量定義
10、slice的異常被映射成c++的類,其數據成員和繼承關係均被保留。但是在每個c++異常類中多出三個public的成員函數(構造函數除外):
    ice_name、ice_clone、ice_throw,分別用來獲取異常名稱、克隆異常、拋出異常本身
11、slice的接口映射成c++的代理類、代理句柄、實例指針,命名分別爲IceProxy::<interface-name>、::<interface-name>Prx、::<interface-name>Ptr
    代理類IceProxy::<interface-name>繼承自IceProxy::Ice::Object
代理句柄::<interface-name>Prx具備默認構造、拷貝構造、賦值操作符。同時具備兩個靜態的向下轉型函數checkedCast、uncheckedCast
代理句柄::<interface-name>Prx支持可視化操作ice_toString,返回對象的名稱標示
代理句柄::<interface-name>Prx支持常用比較操作:==、!=、<、<=、>、>=、布爾判斷
接口的方法被映射成同名的c++方法,可見性public
接口的方法中參數被映射成同名的參數,其類型如果爲基本類型,則被映射成Ice::XXX,string被映射成std::string,其他類型參考以前描述
接口的方法中參數如果爲輸入型參數,則在c++參數前加以const修飾,同時如果輸入參數爲複雜結構,則傳遞引用參數,如果爲輸出參數,則被標示成引用。
接口方法的調用在調用方來看,不用關心內存的申請和釋放問題,都會由ice runtime管理。
接口方法在調用時,如果拋出異常,ice runtime會保證其輸出參數、返回值不會被修改
12、Slice類映射到同名的C++ 類。
    對於每一個Slice數據成員,生成的類都有一個public 數據成員與之對應
對於每一個操作都有一個對應的純虛成員函數
    生成的c++類繼承自Ice::Object,該處注意和接口的基類不一樣
slice爲每個生成的類聲明瞭一個只能指針<class-name>Ptr
每個類中還包含額外的一些方法:ice_isA、ice_id、ice_staticId(static),以及ice_factory(static)
由於映射生成類中所有方法都是純虛的,因此需要擴展繼承並實現其純虛方法。
如果要將某一個映射的類作爲參數返回或者輸入,那麼必需要告訴ice runtime如何創建這個類實例,那麼就需要編寫一個額外的工廠方法:
class ObjectFactory : public Ice::ObjectFactory 
{
    public:
        virtual Ice::ObjectPtr create(const std::string &) 
{
            return new ClassNameI;
        }
        
virtual void destroy() {}
    };
並將其告知ice runtime"ic->addObjectFactory(new ObjectFactory, "::ClassName");"
    ice::Object基類包含了一些特殊的方法:ice_isA、ice_ping、ice_id、ice_hash、ice_staticId(static),因此所有的映射類均可調用上述方法
13、對於爲每個類生成的只能指針,具備如下特性:
    可以通過智能指針調用類的任何public方法
可以使用智能指針和null比較來判斷指針是否爲空
可以通過智能指針的clone方法來深度複製對象,但是深度複製的對象爲基類對象,因此需要進行向下轉型,類似如下操作:
DerivedIPtr p1 = new DerivedI;
    DerivedIPtr p2 = DerivedIPtr::dynamicCast(p1->clone());
所有的程序中創建的內存會在communicator釋放的時候釋放內存。但是爲了防止運行過程中的內存泄露,可以通過顯示的調用Ice::collectGarbage()進行內存回收
當然你可以配置ice的屬性Ice.GC.Interval要求ice運行環境隔段時間自動進行內存回收

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章