C ++スタディノート(5):2次構築モード

0x01 2次構築モードを使用する必要があるのはなぜですか

  • オブジェクト作成時にコンストラクタの実行結果を判定できない
  • 例としてコンストラクターのreturnステートメントを考えます。この結果、オブジェクトが生成されますが、初期化に問題がある可能性があります
  • 初期化プロセス中のメモリアプリケーション、ファイルへのアクセス、その他の操作など、オブジェクトの初期化が期待どおりにならない可能性があるため、コンストラクタの実行が終了しても、オブジェクトが正常に構築されたとは限りません

初期化操作を期待どおりに完了できない場合、取得されたオブジェクトは半完成オブジェクトと呼ばれます。半完成オブジェクトは正当なC ++オブジェクトであり、重要なバグの原因です。

0x02 2次構造を使用する場合

システムリソースの使用を必要とする操作があります(例外が発生する場合があります)。

  • メモリアプリケーション
  • アクセスファイル

0x03 2次構造の使用方法

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\n", obj);

    delete obj;
    
    return 0;
}

2次構築モードの使用:

  1. 初期化が必要なコンテンツは、リソースに依存しない初期操作とシステムリソースアプリケーション操作の2つの段階に分かれています。

  2. コンストラクターと構成()はプライベートを使用してカプセル化されるため、クラスごとにオブジェクトを定義することはできません。

  3. クラスの静的メンバー関数NewInstance()をオブジェクト作成関数として定義します。static TwoPhaseCons * NewInstance();

  4. オブジェクト関数TwoPhaseConsにオブジェクトを作成するには、newを使用します* ret = new TwoPhaseCons();

  5. オブジェクト作成機能では、新しいオブジェクトが正常に作成されたかどうか、および2段階の構築が成功したかどうかを判断します

    TwoPhaseCons* TwoPhaseCons::NewInstance() 
    {
        TwoPhaseCons* ret = new TwoPhaseCons();
    
        // 若第二阶段构造失败,返回 NULL    
        if( !(ret && ret->construct()) ) 
        {
            delete ret;
            ret = NULL;
        }
            
        return ret;
    }
    

おすすめ

転載: www.cnblogs.com/askta0/p/12738956.html
おすすめ