zoukankan      html  css  js  c++  java
  • 第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
    ", obj);
    
        delete obj;
        
        return 0;
    }
    

  • 相关阅读:
    网址
    oracle一些笔记
    GLOBAL_NAMES参数研究
    创建 dblink
    解析grant connect, resource to user语句
    授权
    Bootstrap(转)
    C#操作XML小结(转)
    使用backbone.js、zepto.js和trigger.io开发HTML5 App
    SQLSERVER存储过程基本语法
  • 原文地址:https://www.cnblogs.com/huangdengtao/p/11851074.html
Copyright © 2011-2022 走看看