• <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>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開(kāi)心的工作
            簡(jiǎn)單、開(kāi)放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            ICE筆記(03):客戶端Slice到C++映射

            Posted on 2010-05-12 23:21 S.l.e!ep.¢% 閱讀(1425) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): ICE

            ? ICE筆記(03):客戶端Slice到C++映射 收藏
            【 colorado 】


            按:本文是DPWI第6章的筆記。

            客戶端Slice到C++映射定義的是:怎樣把Slice數(shù)據(jù)類(lèi)型翻譯成C++類(lèi)型,客戶怎樣調(diào)用操作、傳遞參數(shù)、處理錯(cuò)誤。C++映射線程安全,不存在內(nèi)存管理問(wèn)題。不建議查看slice2cpp生成的C++映射文件,但建議掌握C++映射規(guī)則。

            1、模塊映射
            module M{...}
            映射為
            namespace M{...}

            2、類(lèi)型映射
            ⑴基本類(lèi)型
            Slice???? C++
            bool?? → bool
            byte?? → Ice::Byte
            short? → Ice::Short
            int??? → Ice::Int
            long?? → Ice::Long
            float? → Ice::Float
            double → Ice::Double
            string → std::string

            ⑵復(fù)雜類(lèi)型
            Slice???? C++
            枚舉 →?? 枚舉
            結(jié)構(gòu) →?? 結(jié)構(gòu),支持比較符,可用于Slice詞典鍵類(lèi)型,支持深度復(fù)制、賦值。
            序列 →?? std::vector,可以映射為list,dequeue,數(shù)組,范圍。
            詞典 →?? std::map。

            3、異常映射
            異??捎成錇橥鸆++類(lèi),支持如下操作:
            ? ice_name  異常的名字。
            ? ice_clone 多態(tài)克隆異常,在不知道異常類(lèi)型情況下復(fù)制異常。
            ? ice_throw 在不知道某個(gè)異常的確切運(yùn)行時(shí)類(lèi)型的情況下拋出它。
            ? ice_print? 打印異常的名字,或直接使用重載的<<操作符:

            try {
            ??? // ...
            } catch (const Ice::Exception & e) {
            ??? cerr << e << endl;
            }

            出于效率上的考慮,總是通過(guò)const引用捕捉異常。這樣,編譯器就能夠生成不調(diào)用異常復(fù)制構(gòu)造器的代碼(當(dāng)然,同時(shí)也防止異常被切成基類(lèi)型)。調(diào)用操作拋出異常時(shí),該操作的out參數(shù)是否賦值無(wú)法確定,但是操作的返回值肯定沒(méi)有返回。

            一條異常路徑:

            ? Ice::ConnectTimeoutException

            ? Ice::TimeoutException

            ? Ice::LocalException

            ? Ice::UserException

            ? Ice::Exception
            很少需要以最深派生類(lèi)型捕獲運(yùn)行時(shí)異常,而是以LocalException捕獲它們;對(duì)細(xì)粒度異常處理感興趣的,主要是Ice運(yùn)行時(shí)實(shí)現(xiàn)。

            4、接口映射
            module M {
            ??? interface Simple {
            ??????? void op();
            ??? };
            };
            客戶端,接口映射到類(lèi):
            ????????? ↓
            namespace IceProxy {
            ??? namespace M {
            ??????? class Simple;
            ??? }
            }
            namespace M{
            ??? class Simple; — 代理類(lèi)
            ??? typedef IceInternal::ProxyHandle< ::IceProxy::M::Simple> SimplePrx; — 代理句柄
            ??? typedef IceInternal::Handle< ::M::Simple> SimplePtr;
            }
            namespace IceProxy {
            ??? namespace M {
            ??????? class Simple : public virtual IceProxy::Ice::Object {
            ??????? public:
            ??????????? typedef ::M::SimplePrx ProxyType;
            ??????????? typedef ::M::SimplePtr PointerType;
            ??????????? void op();
            ??????????? void op(const Ice::Context&);
            ??????????? //....
            ??????? };
            ??? };
            }
            IceProxy::M::Simple是服務(wù)器Simple接口的客戶端代理類(lèi),它繼承自IceProxy::Ice::Object。接口中的每個(gè)操作,代理類(lèi)都有兩個(gè)重載的、同名的成員函數(shù)。其中一個(gè)函數(shù)的最后一個(gè)參數(shù)的類(lèi)型是Ice::Context——Ice上下文,dictionary<string, string>結(jié)構(gòu),客戶端向服務(wù)器發(fā)送請(qǐng)求時(shí),將該結(jié)構(gòu)一起發(fā)送。

            客戶端不能直接實(shí)例化代理類(lèi):
            IceProxy::M::Simple s;? ← 錯(cuò)誤
            客戶端只能使用代理句柄SimplePrx訪問(wèn)代理類(lèi)Simple。代理句柄能夠自動(dòng)管理內(nèi)存,支持賦值和比較操作符:
            SimplePrx prx1 = ...;
            SimplePrx prx2(prx1);
            prx1=prx2;
            assert(prx1==prx2);
            cout << prx1 << ';' << prx2 << endl; ← 等效方法 prx->ice_toString()
            類(lèi)似方法:communicator->proxyToString(prx);

            BasePrx base = ...;
            DerivedPrx derived = DerivedPrx::checkedCast(base); ← 檢查轉(zhuǎn)換:遠(yuǎn)程訪問(wèn),失敗時(shí)返回null。
            derived = DerivedPrx::uncheckedCast(base); ← 不檢查的轉(zhuǎn)換:不進(jìn)行遠(yuǎn)程訪問(wèn),失敗時(shí)行為不確定。

            代理方法:
            Ice::ObjectPrx base = communicator->stringToProxy(...);
            HelloPrx hello = HelloPrx::checkedCast(base);
            hello = hello->ice_timeout(10000);
            hello->sayHello();

            代理比較:
            代理同一性比較:==,!=,<,<=,>,>=比較,布爾比較;
            代理的對(duì)象同一性比較:
            bool proxyIdentityLess(p1,p2);
            bool proxyIdentityEqual(p1,p2);
            bool proxyIdentityAndFacetLess(p1,p2);
            bool proxyIdentityAndFacetEqual(p1,p2);

            5、操作映射
            對(duì)于所有被映射的Slice 類(lèi)型而言都一樣:你可以安全地忽略操作的返回值,不管它的類(lèi)型是什么——返回值總是通過(guò)傳值返回。如果你忽略返回值,不會(huì)發(fā)生內(nèi)存泄漏,因?yàn)榉祷刂档奈鰳?gòu)器會(huì)按照需要釋放內(nèi)存。

            in 參數(shù),使用傳值或const引用傳遞;
            out參數(shù),使用引用傳遞。

            支持鏈?zhǔn)秸{(diào)用:
            p2->setName(p1->getName()); ← p1,p2為代理

            6、異常處理
            SimplePrx p = ...;
            try {
            ??? p->op();
            } catch (const SimpleError & t) {
            ??? cout << "Simple Error: " << t.reason << endl;
            }
            應(yīng)該總是使用const引用捕捉異常。這樣,編譯器就能生成不調(diào)用異常復(fù)制構(gòu)造器的代碼,同時(shí)防止異常切成基類(lèi)型。操作拋出異常后,操作的參數(shù)是否已改變不能確定;但是接收操作返回值的變量沒(méi)有被改寫(xiě)。

            7、類(lèi)映射:
            Slice類(lèi)映射到同名C++類(lèi)。
            ? 每個(gè)成員映射為C++類(lèi)public成員;
            ? 每個(gè)操作映射為虛成員函數(shù);
            ? 類(lèi)繼承自Ice::Object(代理類(lèi)繼承自Ice::ObjectPrx);
            ? 兩個(gè)構(gòu)造器,一個(gè)缺省,一個(gè)帶有所有成員參數(shù);
            ? 生成<class-name>Ptr智能指針(<class-name>Prx是代理句柄)。

            類(lèi)繼承自Ice::Object基類(lèi)的成員函數(shù):
            ? ice_isA:是否支持指定類(lèi)型ID
            ? ice_ping:類(lèi)可達(dá)測(cè)試
            ? ice_ids:對(duì)象支持的類(lèi)序列,從根類(lèi)到最深派生類(lèi)
            ? ice_id:類(lèi)的實(shí)際ID
            ? ice_staticId:類(lèi)的靜態(tài)類(lèi)型ID
            ? ice_hash:類(lèi)的哈希值
            ? ice_clone:多態(tài)淺復(fù)制
            ? ice_preMarshal:整編本類(lèi)前調(diào)用
            ? ice_postUnmarshal:解編本類(lèi)后調(diào)用
            ? ice_dispatch:請(qǐng)求分派給服務(wù)者
            ? 比較操作符:== != < <= > >=

            類(lèi)成員可見(jiàn)性:
            修改類(lèi)成員的可見(jiàn)性,使用元數(shù)據(jù)指令:["protected"]

            類(lèi)的構(gòu)造函數(shù):
            類(lèi)的缺省構(gòu)造函數(shù),構(gòu)造每個(gè)數(shù)據(jù)成員,簡(jiǎn)單內(nèi)置類(lèi)型不初始化,復(fù)雜類(lèi)型使用該類(lèi)型自己的缺省構(gòu)造初始化。
            類(lèi)的非缺省構(gòu)造函數(shù),每個(gè)數(shù)據(jù)成員一個(gè)參數(shù),可以用一條語(yǔ)句構(gòu)造和初始化。所有參數(shù)按照基類(lèi)到派生類(lèi)的順序,加入?yún)?shù)序列。

            類(lèi)的操作:
            類(lèi)的操作被映射為純虛成員函數(shù),必須創(chuàng)建派生類(lèi),實(shí)現(xiàn)這些操作,才能使用類(lèi)。

            類(lèi)工廠:
            有操作的類(lèi)必須提供類(lèi)工廠,無(wú)操作的類(lèi)不必提供類(lèi)工廠。
            ⑴實(shí)現(xiàn)類(lèi)工廠
            class SimpleFactory : public Ice::ObjectFactory {
            public:
            ??? virtual Ice::ObjectPtr create(const std::string &) {
            ??????? assert(type == M::Simple::ice_staticId());
            ??????? return new SimpleI;
            ??? }
            ??? virtual void destroy() {}
            };
            ⑵注冊(cè)類(lèi)工廠:
            Ice::CommunicatorPtr ic = ...;
            ic->addObjectFactory(new SimpleFactory, M::Simple::ice_staticId());
            ⑶使用類(lèi)工廠:
            現(xiàn)在,每當(dāng)Ice實(shí)例化M::Simple類(lèi)時(shí),就會(huì)自動(dòng)調(diào)用SimpleFactory的create方法,創(chuàng)建SimpleI類(lèi),客戶端可以使用該類(lèi)的op方法。

            類(lèi)的智能指針:
            Slice 編譯器會(huì)為每種類(lèi)類(lèi)型生成智能指針。對(duì)于Slice類(lèi)<class-name>,編譯器會(huì)生成叫作<class-name>Ptr 的C++ 智能指針:
            ??? TimeOfDayPtr tod = new TimeOfDayI;
            不能在棧上分配類(lèi)實(shí)例,也不能用靜態(tài)變量定義類(lèi)實(shí)例。類(lèi)必須由new分配。

            智能指針是異常安全的,當(dāng)拋出異常時(shí),智能指針能夠安全地析構(gòu)。但要注意:在構(gòu)造器中拋出異常,可能使得智能指針不安全;循環(huán)引用的情況下,智能指針也會(huì)不安全,這種情況下,可以使用Ice::collectGarbage();? 收集因循環(huán)引用沒(méi)有釋放的對(duì)象。當(dāng)然只有在循環(huán)引用的情況下,垃圾收集器才有用。在沒(méi)有循環(huán)引用的情況下,使用垃圾收集器沒(méi)有意義。把Ice.GC.Interval 設(shè)成5,收集器線程就會(huì)每5秒運(yùn)行一次垃圾收集器。

            智能指針的比較只會(huì)比較內(nèi)存地址,即比較兩個(gè)指針是否指向同一物理類(lèi)實(shí)例。


            本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/Colorado/archive/2009/11/28/4895778.aspx

            伊人伊成久久人综合网777| 久久久久青草线蕉综合超碰| 精品久久久久久久无码| 久久婷婷国产综合精品| 久久综合丁香激情久久| 性做久久久久久免费观看| 亚洲国产精品高清久久久| 国产国产成人精品久久| 国产女人aaa级久久久级| 久久久久亚洲AV无码专区首JN | 久久久久亚洲AV无码专区桃色| 亚洲另类欧美综合久久图片区| 亚洲精品高清国产一线久久| 久久人爽人人爽人人片AV| 久久综合色之久久综合| 精品久久久久久久无码| 亚洲国产精品久久久久网站| 久久www免费人成看片| 久久99精品国产麻豆婷婷| 久久精品午夜一区二区福利| 久久国产香蕉一区精品| 蜜桃麻豆www久久| 久久人人爽人人爽人人AV东京热 | 国产91色综合久久免费分享| 亚洲精品成人网久久久久久| 色综合久久天天综合| 久久久精品人妻一区二区三区四 | 亚洲人成伊人成综合网久久久| 91超碰碰碰碰久久久久久综合| 日韩精品久久久肉伦网站 | 人人狠狠综合久久亚洲| 人人狠狠综合久久亚洲婷婷 | 精品久久久久久无码国产| 狠狠色丁香久久婷婷综| 99久久精品国内| 国产精品美女久久久m| 亚洲国产精品无码久久98| 国产成人精品综合久久久| 久久人人爽人人爽人人片AV高清| 无码人妻少妇久久中文字幕 | 日本强好片久久久久久AAA|