slice的c++映射
来源:互联网 发布:语言障碍评估软件 编辑:程序博客网 时间:2024/06/07 16:32
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运行环境隔段时间自动进行内存回收
- slice的c++映射
- Slice到C++映射
- 读书笔记--Slice-to-C++映射
- H.264的Slice及Slice类型
- H.264的Slice及Slice类型
- H.264的Slice及Slice类型
- H.264的Slice及Slice类型
- H.264的Slice及Slice类型
- H.264的Slice及Slice类型
- H.264的Slice及Slice类型
- slice函数的用法
- JS的Slice函数
- js的slice函数
- 理解python的slice
- go的slice传参
- slice
- slice
- [].slice
- 第五周实验报告(1-2)
- js截取包含中文的字符串
- 按回车,直接登陆
- OpenCV學習心得(6) -- 圖像的縮放
- 一个Linux下C线程池的实现
- slice的c++映射
- Java程序员应该了解的10个面向对象设计原则
- ZOJ1427 POJ1694 An Old Stone Game
- 第五周实验报告(1-3)
- ICE的AMI方法调用
- 使用JavaScript完成最简单加密解密和模仿QQ的窗口抖动效果
- oracle net configuration assistant安装失败
- 第五周实验报告2
- effective C++笔记之条款33: 明智地使用内联