Symbian 逐步深入
2010-03-26 04:24:00 来源:WEB开发网PushL()可能导致的错误:PushL()只能在TRAP宏内运行,其他在TRAP宏外运行使用CleanStack::PushL()都将导致错误。错误代号:E32User-CBase66
TARP和异常退出是一种内部实现。如果捕捉到其他种类的异常,TARP就可能会产生严重错误。
Symbian两阶段构造
为了避免出现这样一种问题:程序在构造函数初始化了部分信息的时候,出现异常而退出。那些已经分配了内存的、已经得到初始化的数据信息就遗留在内存中得不到释放。Symbian的解决方案是采用两阶段构造。
正规构造函数什么也不做,需要完成某些初始化的动作放在一个叫ConstructL()的函数中。同时为了避免大部分会误用ConstructL().—我们将它声明为private,然后定义一个public static类型函数去执行,这类函数通常是NewL(),他们能够在拥有一个此类的实例之前被调用个。
看代码(新建一个GUI工程的时候自动生成的代码)
CtestDDDocument* CtestDDDocument::NewL(CEikApplication& aApp)
{
CtestDDDocument* self = NewLC(aApp);
CleanupStack::Pop(self);
return self;
}
CtestDDDocument* CtestDDDocument::NewLC(CEikApplication& aApp)
{
CtestDDDocument* self = new (ELeave) CtestDDDocument(aApp);
CleanupStack::PushL(self);
self->ConstructL();
return self;
}
void CtestDDDocument::ConstructL()
{
// No implementation required
}
这里我们介绍下 FunLC()这种LC结尾的函数,说明对象已经被推入到清除栈,并保留了其中的信息。代码如下:
Eg:
CExample* CExample::NewLC()
{
CExample* me=new(ELeave) CExample();
CleanupStack::PushL(me);
me->ConstructL();
return (me);
}
两构造函数可以确保当对象生成的时候,就已经完全初始化了,如果会出现异常,只会出现在 new(ELeave)中或ConstructL()中。
瘦模板
瘦模板的存在的原因在于:
{
…
}
更多精彩
赞助商链接