Symbian C++ 的 NewL ConstructL NewLC ELeave
2010-08-11 12:14:00 来源:WEB开发网那么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 [复制链接] [打 印]更多精彩
赞助商链接