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

S.l.e!ep.¢%

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

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

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

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


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

客戶端Slice到C++映射定義的是:怎樣把Slice數據類型翻譯成C++類型,客戶怎樣調用操作、傳遞參數、處理錯誤。C++映射線程安全,不存在內存管理問題。不建議查看slice2cpp生成的C++映射文件,但建議掌握C++映射規則。

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

2、類型映射
⑴基本類型
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

⑵復雜類型
Slice???? C++
枚舉 →?? 枚舉
結構 →?? 結構,支持比較符,可用于Slice詞典鍵類型,支持深度復制、賦值。
序列 →?? std::vector,可以映射為list,dequeue,數組,范圍。
詞典 →?? std::map。

3、異常映射
異常可映射為同名C++類,支持如下操作:
? ice_name  異常的名字。
? ice_clone 多態克隆異常,在不知道異常類型情況下復制異常。
? ice_throw 在不知道某個異常的確切運行時類型的情況下拋出它。
? ice_print? 打印異常的名字,或直接使用重載的<<操作符:

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

出于效率上的考慮,總是通過const引用捕捉異常。這樣,編譯器就能夠生成不調用異常復制構造器的代碼(當然,同時也防止異常被切成基類型)。調用操作拋出異常時,該操作的out參數是否賦值無法確定,但是操作的返回值肯定沒有返回。

一條異常路徑:

? Ice::ConnectTimeoutException

? Ice::TimeoutException

? Ice::LocalException

? Ice::UserException

? Ice::Exception
很少需要以最深派生類型捕獲運行時異常,而是以LocalException捕獲它們;對細粒度異常處理感興趣的,主要是Ice運行時實現。

4、接口映射
module M {
??? interface Simple {
??????? void op();
??? };
};
客戶端,接口映射到類:
????????? ↓
namespace IceProxy {
??? namespace M {
??????? class Simple;
??? }
}
namespace M{
??? class Simple; — 代理類
??? 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是服務器Simple接口的客戶端代理類,它繼承自IceProxy::Ice::Object。接口中的每個操作,代理類都有兩個重載的、同名的成員函數。其中一個函數的最后一個參數的類型是Ice::Context——Ice上下文,dictionary<string, string>結構,客戶端向服務器發送請求時,將該結構一起發送。

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

BasePrx base = ...;
DerivedPrx derived = DerivedPrx::checkedCast(base); ← 檢查轉換:遠程訪問,失敗時返回null。
derived = DerivedPrx::uncheckedCast(base); ← 不檢查的轉換:不進行遠程訪問,失敗時行為不確定。

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

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

5、操作映射
對于所有被映射的Slice 類型而言都一樣:你可以安全地忽略操作的返回值,不管它的類型是什么——返回值總是通過傳值返回。如果你忽略返回值,不會發生內存泄漏,因為返回值的析構器會按照需要釋放內存。

in 參數,使用傳值或const引用傳遞;
out參數,使用引用傳遞。

支持鏈式調用:
p2->setName(p1->getName()); ← p1,p2為代理

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

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

類繼承自Ice::Object基類的成員函數:
? ice_isA:是否支持指定類型ID
? ice_ping:類可達測試
? ice_ids:對象支持的類序列,從根類到最深派生類
? ice_id:類的實際ID
? ice_staticId:類的靜態類型ID
? ice_hash:類的哈希值
? ice_clone:多態淺復制
? ice_preMarshal:整編本類前調用
? ice_postUnmarshal:解編本類后調用
? ice_dispatch:請求分派給服務者
? 比較操作符:== != < <= > >=

類成員可見性:
修改類成員的可見性,使用元數據指令:["protected"]

類的構造函數:
類的缺省構造函數,構造每個數據成員,簡單內置類型不初始化,復雜類型使用該類型自己的缺省構造初始化。
類的非缺省構造函數,每個數據成員一個參數,可以用一條語句構造和初始化。所有參數按照基類到派生類的順序,加入參數序列。

類的操作:
類的操作被映射為純虛成員函數,必須創建派生類,實現這些操作,才能使用類。

類工廠:
有操作的類必須提供類工廠,無操作的類不必提供類工廠。
⑴實現類工廠
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() {}
};
⑵注冊類工廠:
Ice::CommunicatorPtr ic = ...;
ic->addObjectFactory(new SimpleFactory, M::Simple::ice_staticId());
⑶使用類工廠:
現在,每當Ice實例化M::Simple類時,就會自動調用SimpleFactory的create方法,創建SimpleI類,客戶端可以使用該類的op方法。

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

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

智能指針的比較只會比較內存地址,即比較兩個指針是否指向同一物理類實例。


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/Colorado/archive/2009/11/28/4895778.aspx

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美福利视频网站| 一区二区三区日韩在线观看| 国产伦精品一区二区三区高清版| 久久久久久久综合色一本| 日韩视频久久| 亚洲精品日本| 免费在线看成人av| 久久久久国产精品人| 夜夜夜久久久| 日韩性生活视频| 亚洲激情网址| 亚洲高清影视| 国产精品福利久久久| 久久综合影视| 午夜伦理片一区| 亚洲欧洲av一区二区三区久久| 亚洲国产高清高潮精品美女| 国产日韩精品一区二区三区| 国产精品乱码妇女bbbb| 国产欧美欧美| 久久青草欧美一区二区三区| 欧美激情小视频| 亚洲日韩中文字幕在线播放| 99精品国产一区二区青青牛奶| 国产精品女主播在线观看 | 亚洲人精品午夜在线观看| 欧美高清在线一区二区| 久久婷婷色综合| 久久久7777| 亚洲欧美视频在线| 悠悠资源网久久精品| 激情欧美一区二区| 亚洲人成77777在线观看网| 亚洲精品视频在线播放| 一区二区三欧美| 亚洲女人天堂成人av在线| 欧美在线亚洲| 欧美成人a视频| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 久久在线播放| 亚洲国产精品久久久久婷婷884| 最新日韩中文字幕| 亚洲天堂av图片| 一区二区三区高清不卡| 亚洲三级性片| 亚欧美中日韩视频| 欧美电影免费观看高清完整版| 欧美激情精品久久久久久| 国产精品v欧美精品∨日韩| 玖玖玖国产精品| 国产精品女人网站| 亚洲人成网站999久久久综合| 亚洲一区二区精品| 麻豆精品精品国产自在97香蕉| 欧美激情一区二区三级高清视频 | 夜夜嗨av一区二区三区网站四季av| 午夜国产不卡在线观看视频| 欧美激情日韩| 黄色一区二区三区| 性欧美暴力猛交69hd| 欧美电影免费网站| 午夜精品短视频| 欧美激情在线狂野欧美精品| 欧美成人资源| 亚洲国产另类久久精品| 欧美影视一区| 国产精品午夜在线观看| 好吊妞**欧美| 午夜天堂精品久久久久| 亚洲国产日韩在线一区模特| 亚洲三级国产| 免费成人性网站| 国产精品超碰97尤物18| 国产精品自在线| 99亚洲一区二区| 欧美一区二区三区在线观看视频| 亚洲精品久久久久久下一站| 欧美在线观看网址综合| 国产精品美女久久久久aⅴ国产馆| 亚洲精品欧美日韩| 欧美成va人片在线观看| 久久精品国产综合精品| 国产精品丝袜久久久久久app| 在线亚洲免费| 亚洲免费高清| 久久久久国产成人精品亚洲午夜| 亚洲一区日韩| 国产精品另类一区| 亚洲综合色婷婷| 亚洲视频成人| 国产精品一区二区三区久久| 午夜精品久久久久久久99热浪潮| 亚洲伦伦在线| 国产精品婷婷| 久久九九免费| 久久久久国产精品一区二区| 欧美成人精品在线视频| 亚洲国产老妈| 亚洲精品激情| 欧美色欧美亚洲另类二区| 亚洲视频中文| 亚洲免费视频在线观看| 国产丝袜一区二区三区| 久久久精品网| 免费欧美日韩国产三级电影| 国语自产在线不卡| 老司机免费视频一区二区| 香港久久久电影| 亚洲国产日韩欧美在线99| 免费成人黄色| 久久久久久自在自线| 亚洲精品欧美精品| 免费观看成人| 亚洲国产黄色片| 欧美午夜精品久久久久久孕妇| 久久精品国产99| 蜜臀久久99精品久久久久久9| 99精品99| 亚洲欧美另类久久久精品2019| 国模私拍视频一区| 亚洲精品一区二区网址| 国产日产欧美精品| 国产精品天美传媒入口| 在线精品一区二区| 亚洲人在线视频| 国产亚洲精品一区二区| 亚洲国产婷婷香蕉久久久久久| 久久精品一区二区三区不卡牛牛| 亚洲婷婷在线| 久久综合伊人77777尤物| 欧美大片免费| 久久一区免费| 国产精品久久久一本精品| 亚洲欧洲视频在线| 亚洲肉体裸体xxxx137| 国内一区二区三区在线视频| 日韩一级黄色大片| 樱桃国产成人精品视频| 亚洲视频在线观看| 亚洲精品免费网站| 老司机精品视频一区二区三区| 欧美国产日产韩国视频| 欧美欧美午夜aⅴ在线观看| 欧美有码视频| 欧美网站大全在线观看| 欧美激情第一页xxx| 国产偷国产偷亚洲高清97cao| 久久欧美肥婆一二区| 国产精品捆绑调教| 一本色道久久88综合日韩精品| 亚洲欧洲一区二区三区在线观看| 一区二区三区日韩精品| 久久麻豆一区二区| 久久久另类综合| 噜噜爱69成人精品| 美女脱光内衣内裤视频久久影院| 国产精品久久久久秋霞鲁丝| 亚洲免费成人| 一片黄亚洲嫩模| 欧美区一区二| 久久久91精品国产| 国产欧美日韩中文字幕在线| 亚洲视频1区| 亚洲欧美日韩国产综合在线 | 亚洲国产成人久久综合一区| 亚洲欧美日韩在线观看a三区| 亚洲免费视频一区二区| 欧美视频专区一二在线观看| 99国产精品自拍| 亚洲性感美女99在线| 欧美日韩中文字幕在线| 欧美一级视频一区二区| 久久蜜桃精品| 在线看片一区| 欧美黄色免费网站| 日韩系列在线| 另类亚洲自拍| 亚洲日韩中文字幕在线播放| 欧美电影在线| 亚洲每日更新| 亚洲欧美一区二区激情| 国产区亚洲区欧美区| 久久久99国产精品免费| 西瓜成人精品人成网站| 午夜亚洲精品| 久久久福利视频| 亚洲视频欧美视频| 国产精品人成在线观看免费| 欧美中文字幕视频在线观看| 欧美高清视频一区二区三区在线观看 | 亚洲资源av| 亚洲国产美国国产综合一区二区| 亚洲精品中文字幕在线观看| 欧美性事免费在线观看| 欧美亚洲一级片| 99re成人精品视频| 久久久久久久国产| 在线亚洲激情| 亚洲国产精品久久久久| 欧美视频精品在线观看|