0x01 2次構築モードを使用する必要があるのはなぜですか
- オブジェクト作成時にコンストラクタの実行結果を判定できない
- 例としてコンストラクターのreturnステートメントを考えます。この結果、オブジェクトが生成されますが、初期化に問題がある可能性があります
- 初期化プロセス中のメモリアプリケーション、ファイルへのアクセス、その他の操作など、オブジェクトの初期化が期待どおりにならない可能性があるため、コンストラクタの実行が終了しても、オブジェクトが正常に構築されたとは限りません
初期化操作を期待どおりに完了できない場合、取得されたオブジェクトは半完成オブジェクトと呼ばれます。半完成オブジェクトは正当なC ++オブジェクトであり、重要なバグの原因です。
0x02 2次構造を使用する場合
システムリソースの使用を必要とする操作があります(例外が発生する場合があります)。
- メモリアプリケーション
- アクセスファイル
0x03 2次構造の使用方法
コード例:
#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次構築モードの使用:
-
初期化が必要なコンテンツは、リソースに依存しない初期操作とシステムリソースアプリケーション操作の2つの段階に分かれています。
-
コンストラクターと構成()はプライベートを使用してカプセル化されるため、クラスごとにオブジェクトを定義することはできません。
-
クラスの静的メンバー関数NewInstance()をオブジェクト作成関数として定義します。static TwoPhaseCons * NewInstance();
-
オブジェクト関数TwoPhaseConsにオブジェクトを作成するには、newを使用します* ret = new TwoPhaseCons();
-
オブジェクト作成機能では、新しいオブジェクトが正常に作成されたかどうか、および2段階の構築が成功したかどうかを判断します
TwoPhaseCons* TwoPhaseCons::NewInstance() { TwoPhaseCons* ret = new TwoPhaseCons(); // 若第二阶段构造失败,返回 NULL if( !(ret && ret->construct()) ) { delete ret; ret = NULL; } return ret; }