所谓“二阶构造”,其实就是说当某个类的构造函数中,既涉及到类中成员变量的初始化操作,又涉及到系统资源(如申请堆空间、打开外部文件等等)的申请,且该种申请可能会失败的情况时,我们可以将传统的一个构造函数的主体人为的拆分成为2步来进行:
* 第一步:形式上就是传统的构造函数,不同的是这里需要将该构造函数的访问属性设置为private,在该构造函数中只进行类中普通成员变量的初始化操作,一般的,纯粹的赋值操作不会发生意外(不成功的情况)
* 第二步:一般的,类中额外定义一个名为construct()的私有成员方法,该方法中,进行该类的实例化操作时涉及到的系统资源的申请工作,返回值表示申请的成功或失败
注:
在二阶构造中,我们需要把上述2步涉及到的成员方法(包括构造函数和construct()的访问属性均设置为private),然后再额外的定义一个public的名为newInstance()的static成员方法,用来进行实际的类对象的定义。
在这个newInstance()成员方法中,会首先在堆空间上申请类对象所占用的内存空间,然后通过该类对象调用construct成员方法进行系统资源的申请操作,最终表现为:对象实例化成功,则返回该对象的指针,对象实例化失败,则返回一个NULL空指针。
具体小例如下:
1 #include <stdio.h>
2
3 class Test
4 {
5 private:
6 int _mPara1;
7 int _mPara2;
8 int* _mP;
9
10 Test()
11 {
12 _mPara1 = 1;
13 _mPara2 = 2;
14 }
15 bool construct()
16 {
17 bool ret = true;
18
19 _mP = new int(5);
20
21 if(!_mP)
22 {
23 ret = false;
24 }
25
26 return ret;
27 }
28 public:
29 static Test* newInstance()
30 {
31 Test* ret = new Test();
32
33 if(!(ret && ret->construct()))
34 {
35 delete ret;
36 ret = NULL;
37 }
38
39 return ret;
40 }
41 void print()
42 {
43 printf("*_mP = %d\n", *_mP);
44 printf("_mPara1 = %d\n", _mPara1);
45 printf("_mPara2 = %d\n", _mPara2);
46 }
47 };
48
49 int main(int argc, char** argv)
50 {
51 Test* t = Test::newInstance();
52
53 t->print();
54
55 return 0;
56 }