资料收集站

SDL

Tuesday
Jan 06th
Text size
  • Increase font size
  • Default font size
  • Decrease font size

Symbian OS异常三步曲之三:两段构造

一、两段构造的格式:

编写一个类时,将构造代码分为两部分:

1、 一个基本的不会发生异常退出的构造函数

这个构造函数将被new操作符调用,它隐式的调用基类的构造函数,另外还可以调用那些不会发生异常退出的函数,也可以以默认值或传入构造函数的参数来初始化成员变量。

2、 一个类方法(通常称为ConstructL())

只要通过new操作符分配并构造的对象被压入了清除栈,该方法就可以单独调用了,它将继续完成对象的构造过程,这里面可以安全的执行那些可能发生异常退出的操作。即使发生了异常,由于之前已经将对象指针入栈,清除栈可以调用类的析构函数来释放所有已经成功分配的资源,并回收分配给对象本身的内存。

实例:

class CExample : public CBase

{

       public:

static CExample* NewL();//静态函数

static CExample* NewLC();//静态函数

              ~CExample();//析构函数必须public,否则delete不能调用

       private:

              CExample();//绝对不能异常

              ConstructL();//将构造时所有可能异常的代码放在这里

}

为了安全和使用上的方便,往往在类的定义里面添加两个静态的函数NewL()和NewLC(),作用主要是将两段构造关联到一起。

CExample* CExample::NewLC()

{

       CExample* me = new(ELeave) CExample();

       CleanupStack::PushL(me);

       me->ConstrutL();

       return me;

}

CExample* CExample::NewL()

{

       CExample me = CExample::NewLC();

       CleanupStack::Pop(me);

       return me;

}

当然,NewL()和NewLC()函数是可以接受参数的,并可以通过参数来初始化对象。这些参数可以传递给简单构造函数,也可以传递给ContructL(),或者同时传递给两者。

二、使用须知:

如果你的类派生自某基类,而该基类也实现了ConstructL(),那么就要保证当对象被构造时,如果需要,基类的ConstructL()也会被调用(C++能够保证基类第一段简单构造函数会被构造函数自动调用),因此,需要我们自己在ConstructL()中显式的(通过域操作符)调用所有基类的ConstructL(),这样才能保证在初始化派生类对象之前,基类子对象都已经被完全构造了。

Comments (0)Add Comment

Write comment

busy
 

Google 搜索

在线用户

We have 45 guests online