symbian常用类的对比分析

T类:和symbian内置类型功能相当,声明后即可使用T类对象,一般创建在栈上,由系统自动删除。

C类:均从基类CBase继承。有构造函数和析构函数,必须创建在堆上,通过delete或清除栈删除。 

R类:资源类,实质上是一个句柄,不为用户所有,它属于服务器,没有构造函数和析构函数,一般创建在栈上。在client server 模式之下,R类相当对服务器对象在客户端的影射,也就是通过这个句柄,就可以访问服务器相关的服务,但是client端的句柄对象一定是active的, 也就是说要和服务器端的实质对象建立关联,所以开始的时候要调用open函数,结束的时候要调用close, 以免资源泄露。

M类:定义接口,其中往往全是纯虚函数,实现回调函数或观察器函数。

 

T

C

R

M

创建位置

1、  堆栈:无论是正常还是异常离开函数作用域,T类对象均能被正确清除,即使定义了T类析构函数,清除时也不会用到。

2、  :这时应该在可能异常的调用代码前将其推入清除栈,一旦异常,对象可被清除栈释放,无需调用析构函数。

只在堆上创建C类对象

1、  作为类成员或做为堆栈上的自动变量。

2、  堆上。

如果创建,那么一般在堆上。

如何创建

没有构造器

像简单类型那样直接声明即可

 

 

没有构造函数

成员变量

1、内建类型或其他T类对象

2、具有使用关系而非拥有关系的指针和引用(无需析构函数特意释放)

 

 

不能有数据成员,因为M类从来不需要实例化,因而不需要构造函数。

成员方法

有成员方法

 

 

 

如何销毁

无需用户自己销毁,会在对象不再使用或异常退出时,由堆栈或清除栈自动清除。

1CBase基类具有虚析构函数,便于被子类重载。使用清除栈,要推入CBase派生类对象时,调用的是CcleanupStack::PushLCBase *aPtr)重载函数,当CcleanupStack::PopAndDestroy()时,此时会调用析构函数正确清除CBase派生类对象

2、如果是非CBase派生类对象被推入清除栈,将调用CcleanupStack::PushL(Tany *aPtr) ,那么当CcleanupStack::PopAndDestroy()时,并不会调用该对象的析构函数,也就是说非CBase派生类对象在被清除栈清除时并不一定能清除干净。

3持有CBase派生类对象,在析构函数中调用delete()清除。如果不持有该对象,那么在异常之前,将其指针推入清除栈。

1、  使用Close()关闭资源

2、  一般不具有析构函数,因为R类对象往往很小,通常除了资源句柄就没有其他数据成员了,因此一般不需要析构函数。因为相关清除工作在Close()方法就已经完成了。

3、  对象创建在堆上时,可以使用:CleanupClosePushL()或类似函数确保资源能够被清除,另一个函数是标准的CleanupStack::PushLTany*),它简单的在对象所处的堆单元上调用User::Free()。

可以有也可以没有析构函数,如果有析构函数,则强制该类从CBase类进行派生,原因在于析构函数调用delete,从而要求该对象必须基于堆的,而不能被置于堆栈上。

特点

1、也可以修饰枚举类型

2、没有析构函数

3、  早期symbian中的结构用S前缀声明,后来也被T类取代。

1、  都从Cbase类派生(在e32base.h中定义)

2、  C类具有析构函数,而且通常都有

表示外部资源句柄,必须对R类对象调用Close(),从而清除其所持有的资源

M类是抽象接口类,往往定义回掉接口或定义观察器类

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值