关闭

slice的c++映射

标签: c++iteratorstringincludeobjectdictionary
3344人阅读 评论(0) 收藏 举报
分类:

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运行环境隔段时间自动进行内存回收

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:90344次
    • 积分:1187
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:3篇
    • 译文:0篇
    • 评论:23条
    文章分类
    最新评论