Symbian OS不支持STL,主要原因是因为STL覆盖的面太广,不适合在内存受限的设备上使用。
在这里我们首先学习RArray模板类。如果您有java或者.net方面的经验,Symbian中的RArray和RPointerArray类似于java中的Vector<>或.net中的List<>。
注意事项:
RArray和RPointerArray都是基于模板的
RArray的模板参数应该为R类或T类,而RPointerArray的模板参数可以是任意类型
RArray是固定长度对象的集合(最小长度为4个字节,对象的sizeof必须>4!),RPointerArray是对象指针的集合
RArray和RPointerArray应该创建在栈上,或者为C类的成员变量
接下来我们将针对RArray和RPointerArray的几个常用的方法进行介绍,以下所有演示代码都在控制台程序中执行。
一、常用方法
1、[]操作符
RArray重载了[]操作符:
inline const T &operator[](TInt anIndex) const;
inline T &operator[](TInt anIndex);
2、添加元素,Append和AppendL方法:
首先我们使用一断代码来说明Append(L)的使用方法:
_LIT(KText1, "Hello world 1");
_LIT(KText2, "Hello world 2");
RArray<TDesC> array;
array.Append(KText1());
array.Append(KText2());
console->Write(array[0]);
array.Reset();
array.Close();
按照我们的理解,控制台输出的应该是“Hello World 1”,但事实上,控制台输出的是乱码,为什么呢?
我们上面的注意事项中的第三点:“RArray是固定长度对象的集合”,模板参数的长度在RArray构建时被确定,但是TDesC类型的长度明显是可变的(TDesC为描述符的基类,描述符的派生类的长度会根据包含的内容改变),所以在此得不到正确的结果。
因为,我们在创建RArray的时候确定描述符的大小就可以了,有两种方法:
_LIT(KText1, "Hello world 1");
_LIT(KText2, "Hello world 2");
RArray<TPtrC> array;
array.Append(KText1());
array.Append(KText2());
console->Write(array[0]);
array.Reset();
array.Close();
或
typedef TBufC<20> TBufParam;
_LIT(KText1, "Hello world 1");
_LIT(KText2, "Hello world 2");
RArray<TBufParam> array;
array.Append(KText1());
array.Append(KText2());
console->Write(array[0]);
array.Reset();
array.Close();