第4章. 两段构造

 

  由于构造函数不允许发生异常退出,即在构造时分配的资源必须在异常退出时正常的释放,所以采用了两段构造的方法。

1、两段构造的实现方法:

  在类中首先将构造函数换为静态函数来包裹这两段代码,即:

  public:

    static CExample* NewL()或NewLC();       //包裹实现了两段构造的静态函数

    ~CExample();                       //析构函数

  之后用私有成员来实现两段构造各自的代码:

  private:

    CExample();

    void ConstructL();

 

  其中第一段CExample()包含了不会发生异常退出的操作,而第二段的类方法ConstructL()可以对其使用清除栈来保存对象指针,如在ConstructL()时发生异常则调用析构函数~CExample()来释放资源。如能正常完成则返回分配对象的指针。

 

  NewL()及NewLC()的实现:

  CExample* CExample::NewLC()

  {

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

  CleanupStack:PushL(me);

  me->ConstructL();

  return(me);

  }

 

  CExample* CExample::NewL ()

  {

  Cexampel* me = CExample::NewLC();

  CleanupStack::Pop(me);

  return(me);

  }

  可以看出,NewL()函数是通过NewLC()来实现的。这两个函数也是可以接受参数的,可以通过参数来初始化对象。这些参数可以传给两段构造的任何一步,或者二段都传递给。

 

2、Tips

  在派生类中,如果基类也实现了ConstructL(),要保证当需要时基类的ConstructL()也被调用。因此应该在派生类的ConstructL()中显式的(通过域操作符)调用所有基类的ConstructL()。

  考虑可以在标准构造函数开始前将对象压入清除栈,以避免两段构造。但是这样的操作方式为基类的话,对于它的派生类都要多调用一次PushL()及对应的Pop(),而采用NewL()只有一次清栈操作。另外,C++的构造函数也无法加以L后缀。

  在定义基于两段构造法的析构函数时,要验证试图释放的指针或句柄是否为有效的,即加if(iMyMember) delete iMyMember。

 

posted on 2008-10-13 15:50  王少敏  阅读(327)  评论(0)    收藏  举报

导航