第27课.二阶构造模式

1.构造函数遇到的问题

a.构造函数只提供自动初始化成员变量的机会
b.不能保证初始化逻辑一定成功(涉及到内存容易出错)
c.执行return语句后构造函数立即结束

注:构造函数能决定的只是对象的初始状态,而不是对象的诞生

2.半成品对象

半成品对象:初始化操作不能按照预期完成而得到的对象(即初始化只做了一部分,或者失败)。
半成品对象是合法的,但是它确实bug的一个来源。

3.二阶构造

工程开发中的构造过程可分为两部分
a.资源无关的初始化操作(不可能出现异常情况的操作)
b.需要使用系统资源的操作(可能出现异常情况,如:内存申请(失败),访问文件(失败))

二阶构造示例:

class TwoPhaseCons
{
private: //私有,不能被外界调用
TwoPhaseCons() //第一阶段构造函数
{
}

bool construct() //第二阶段构造函数
{
return true;
}

public:
static TwoPhaseCons* NewInstance(); //对象创建函数
};

TwoPhaseCons* TwoPhaseCons::NewInstance()
{
TwoPhaseCons* ret = new TwoPhaseCons(); //静态成员函数怎么能直接调用成员函数呢?

//这里的情况是这样的这里调用了构造函数,而构造函数不是普通的成员函数。
//理论上来说,这里应该生成一个临时对象,这样也就说的通了
/* eg:
对于_instance = new MazeFactory这句,编译器做了如下扩展
_instance = operator new Mazefactory;//分配内存
_instance->Mazefactory::Mazefactroy();//调用构造函数,
可以看到此处构造函数是可以得到this指针

所以,只要有对象的this指针,在静态函数中是可以调用非静态函数的
*/
//若第二阶段构造失败,返回NULL
if(!(ret && ret->construct()))
{
delete ret;
ret = NULL;
}

return ret;
}

eg:

include <stdio.h>

class TwoPhaseCons
{
private:
TwoPhaseCons() //
{

}

bool construct() //
{
return true;
}

public:
static TwoPhaseCons* NewInstance(); //
};

TwoPhaseCons* TwoPhaseCons::NewInstance()
{
TwoPhaseCons* ret = new TwoPhaseCons();

if(!(ret && ret->construct()))
{
delete ret;
ret = NULL;
}

return ret;
}

int main()
{
TwoPhaseCons* obj = TwoPhaseCons::NewInstance();

printf("obj = %p\n", obj);

delete obj;

return 0;
}

posted @ 2019-11-14 10:28  人民广场的二道贩子  阅读(119)  评论(0)    收藏  举报