第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;
}