• C++学习笔记(五):二阶构造模式


    0x01 为什么需要使用二阶构造模式

    • 在创建对象的时候无法判断构造函数的执行结果
    • 以在构造函数中执行return语句时为例,这样的结果是对象会诞生但是初始化可能会存在问题
    • 构造函数执行结束并不意味着对象构造成功,因为对象的初始化可能不是预期的,比如初始化过程有内存申请,访问文件等操作

    如果初始化操作不能按照预期完成而得到的对象叫半成品对象,半成品对象是合法的C++对象,也是Bug的重要来源。

    0x02 何时使用二阶构造

    有需要使用系统资源的操作(可能出现异常的情况):

    • 内存申请
    • 访问文件

    0x03 如何使用二阶构造

    1587371895422

    代码示例:

    #include <stdio.h>
    
    class TwoPhaseCons 
    {
    private:
        TwoPhaseCons() // 第一阶段构造函数
        {   
        }
        bool construct() // 第二阶段构造函数
        { 
            return true; 
        }
    public:
        static TwoPhaseCons* NewInstance(); // 对象创建函数
    };
    
    TwoPhaseCons* TwoPhaseCons::NewInstance() 
    {
        TwoPhaseCons* ret = new TwoPhaseCons();
    
        // 若第二阶段构造失败,返回 NULL    
        if( !(ret && ret->construct()) ) 
        {
            delete ret;
            ret = NULL;
        }
            
        return ret;
    }
    
    
    int main()
    {
        TwoPhaseCons* obj = TwoPhaseCons::NewInstance();
        
        printf("obj = %p
    ", obj);
    
        delete obj;
        
        return 0;
    }
    

    二阶构造模式的使用:

    1. 将需要初始化的内容分为两个阶段:资源无关初始操作、系统资源申请操作。

    2. 构造函数、construct()都使用private进行封装,因此无法通过类来定义对象。

    3. 类中定义静态成员函NewInstance()数作为对象创建函数。static TwoPhaseCons* NewInstance();

    4. 在对象函数中使用new创建对象,TwoPhaseCons* ret = new TwoPhaseCons();

    5. 在对象创建函数中对new对象创建是否成功以及二阶段构造是否成功进行判断

      TwoPhaseCons* TwoPhaseCons::NewInstance() 
      {
          TwoPhaseCons* ret = new TwoPhaseCons();
      
          // 若第二阶段构造失败,返回 NULL    
          if( !(ret && ret->construct()) ) 
          {
              delete ret;
              ret = NULL;
          }
              
          return ret;
      }
      
  • 相关阅读:
    红黑树实现
    Java环境变量的配置及意义
    Java 内存分配全面浅析
    吸血鬼数字
    nat模式、路由模式,网桥模式
    WebService 的创建,部署和使用
    摩尔定律
    计算机组成
    世界是数字的
    面试
  • 原文地址:https://www.cnblogs.com/askta0/p/12738956.html
Copyright © 2020-2023  润新知