この特定の問題に対処するためのパターンはわかりません。これはトリッキーな設計上の問題であり、C++ のような言語にやや特有のものです。もう 1 つの問題は、この質問に対する答えが、個人 (または企業) のコーディング スタイルに密接に関係していることです。
これらのメンバーにはポインターを使用し、構築する必要がある場合は同時に割り当てます。これらに auto_ptr を使用し、NULL に対してチェックして、初期化されているかどうかを確認できます。(ポインターは C/C++/Java の組み込みの「オプション」型であると思います。NULL が有効なポインターではない他の言語があります)。
スタイルの問題の 1 つは、コンストラクターに頼りすぎて多くの作業を行う可能性があることです。オブジェクト指向をコーディングしているときは、オブジェクトを一貫した状態にするのに十分な作業をコンストラクターに行わせます。たとえば、Image
クラスがあり、ファイルから読み取りたい場合、次のようにすることができます。
image = new Image("unicorn.jpeg"); /* I'm not fond of this style */
または、私はこれを行うことができます:
image = new Image(); /* I like this better */
image->read("unicorn.jpeg");
コンストラクターに大量のコードが含まれている場合、特に「コンストラクターが失敗するとどうなるか」という質問をすると、C++ プログラムがどのように機能するかを推論するのが難しくなる可能性があります。これは、コンストラクターからコードを移動する主な利点です。
もっと言いたいことがありますが、遅延建設で何をしようとしているのかわかりません。
編集:いつでもオブジェクトのコンストラクターを呼び出す (ややひねくれた) 方法があることを思い出しました。次に例を示します。
class Counter {
public:
Counter(int &cref) : c(cref) { }
void incr(int x) { c += x; }
private:
int &c;
};
void dontTryThisAtHome() {
int i = 0, j = 0;
Counter c(i); // Call constructor first time on c
c.incr(5); // now i = 5
new(&c) Counter(j); // Call the constructor AGAIN on c
c.incr(3); // now j = 3
}
この手法を使用する明確な理由がない限り、これほど無謀なことをすると、仲間のプログラマーから軽蔑される可能性があることに注意してください。これもコンストラクターを遅らせることはなく、後でもう一度呼び出すことができます。