WEB开发网
开发学院手机开发Symbian 开发 Symbian C++ 的 NewL ConstructL NewLC ELeave 阅读

Symbian C++ 的 NewL ConstructL NewLC ELeave

 2010-08-11 12:14:00 来源:WEB开发网   
核心提示:那么NewLC又是什么呢?和NewL有什么不同?有些类是这样的,他们提供一些方法,Symbian C++ 的 NewL ConstructL NewLC ELeave(2),需要在对象创建完成后执行,但是这些方法也是会产生异常的比如CFoo 如果有一个方法叫 DoSomethingL(),为了防止使用者用new或者在栈

那么NewLC又是什么呢?和NewL有什么不同?有些类是这样的,他们提供一些方法,需要在对象创建完成后执行,但是这些方法也是会产生异常的比如CFoo 如果有一个方法叫 DoSomethingL()。那么程序可以这样写吗?

CFoo *p = CFoo::NewL();

p->DoSomethingL();

显然这样写是有问题的正确的写法是

CFoo *p = CFoo::NewL();

CleanupStack::PushL(p);

p->DoSomethingL();

CleanupStack::Pop();

天啊,又是4条语句,太麻烦了。要知道在NewL结尾我们刚刚把CFoo的指针从CleanupStack里拿出来,马上就又放了进去。是不是可以简化呢,那好我们再节约2条语句:NewL去掉结尾的CleanupStack::Pop();

static CFoo *NewL()

{

CFoo *self = new(ELeave) CFoo();

CleanupStack::PushL(self);

self->ConstructL();

return self;

}

调用去掉CleanupStack::PushL

CFoo *p = CFoo::NewL();

p->DoSomethingL();

CleanupStack::Pop();

Symbian的设计者又规定了,具有以上行为的NewL 应该叫NewLC。表示指针返回后,没有从CleanupStack里取出,你可以继续调用一个危险的操作,在最后调用 CleanupStack::Pop();我发现 NewL 可以通过调用NewLC实现。

那么一个符合Symbian设计师的N条规定的类应该这样写

class CFoo

{

public:

static CFoo *NewLC()

{

CFoo *self = new(ELeave) CFoo();

CleanupStack::PushL(self);

self->ConstructL();

return self;

}

static CFoo *NewL()

{

CFoo *self = NewLC();

CleanupStack::Pop();

return self;

}

virtual ~CFoo()

{

}

protected:

CFoo()

{

}

void ConstructL()

{

// ....

}

}

这里注意 CFoo的构造函数不能是Public的,为了防止使用者用new或者在栈上创建对象。析构函数要写成虚函数,这是纯C++问题,不明白的去看

Tags:Symbian NewL ConstructL

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