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类从来不需要实例化,因而不需要构造函数。 |
成员方法 | 有成员方法 |
|
|
|
如何销毁 | 无需用户自己销毁,会在对象不再使用或异常退出时,由堆栈或清除栈自动清除。 | 1、CBase基类具有虚析构函数,便于被子类重载。使用清除栈,要推入CBase派生类对象时,调用的是CcleanupStack::PushL(CBase *aPtr)重载函数,当CcleanupStack::PopAndDestroy()时,此时会调用析构函数正确清除CBase派生类对象 2、如果是非CBase派生类对象被推入清除栈,将调用CcleanupStack::PushL(Tany *aPtr) ,那么当CcleanupStack::PopAndDestroy()时,并不会调用该对象的析构函数,也就是说非CBase派生类对象在被清除栈清除时并不一定能清除干净。 3持有CBase派生类对象,在析构函数中调用delete()清除。如果不持有该对象,那么在异常之前,将其指针推入清除栈。 | 1、 使用Close()关闭资源 2、 一般不具有析构函数,因为R类对象往往很小,通常除了资源句柄就没有其他数据成员了,因此一般不需要析构函数。因为相关清除工作在Close()方法就已经完成了。 3、 对象创建在堆上时,可以使用:CleanupClosePushL()或类似函数确保资源能够被清除,另一个函数是标准的CleanupStack::PushL(Tany*),它简单的在对象所处的堆单元上调用User::Free()。 | 可以有也可以没有析构函数,如果有析构函数,则强制该类从CBase类进行派生,原因在于析构函数调用delete,从而要求该对象必须基于堆的,而不能被置于堆栈上。 |
特点 | 1、也可以修饰枚举类型 2、没有析构函数 3、 早期symbian中的结构用S前缀声明,后来也被T类取代。 | 1、 都从Cbase类派生(在e32base.h中定义) 2、 C类具有析构函数,而且通常都有 | 表示外部资源句柄,必须对R类对象调用Close(),从而清除其所持有的资源 | M类是抽象接口类,往往定义回掉接口或定义观察器类 |