WEB开发网
开发学院手机开发Symbian 开发 Symbian 逐步深入 阅读

Symbian 逐步深入

 2010-03-26 04:24:00 来源:WEB开发网   
核心提示:PushL()可能导致的错误:PushL()只能在TRAP宏内运行,其他在TRAP宏外运行使用CleanStack::PushL()都将导致错误,Symbian 逐步深入(2),错误代号:E32User-CBase66TARP和异常退出是一种内部实现,如果捕捉到其他种类的异常,就已经完全初始化了,如果会出现异常,TAR

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()中。

瘦模板

瘦模板的存在的原因在于:

class TmyCls

{

}

上一页  1 2 3 4 5 6 7  下一页

Tags:Symbian 逐步 深入

编辑录入:coldstar [复制链接] [打 印]
赞助商链接