2011-10-25 5 views
4

可能性のある重複オブジェクトの作成を終了します:
How to handle failure in constructor in C++?は、コンストラクタで

を何かが失敗した場合ので、私はコンストラクタでオブジェクトの作成を終了する可能性がC++のいずれかのパターンがありますか?そして、コンストラクタを呼び出すクライアントは、失敗したオブジェクト作成に関する情報を得ましたか?

答えて

11

はい、次のことができます。例外をスローします。これはほとんど賢明な方法です。適切な例外クラス(標準または独自のいずれか)を選択し、適切なエラーメッセージなどを指定することで、呼び出し元に何が間違っているかを伝えることができます。

よくある質問has more details

+0

@userbb:完全に構築されたメンバーはすべて破棄されますが、オブジェクト自体のデストラクタは呼び出されません。 –

5

例外をスローする必要があります。これが失敗するオブジェクトの作成を処理する最善の方法です。

Constructor Failuresは、Herb SutterのGOTWからの面白い読書である必要があります。

これを行うもう1つの方法は、コンストラクタにエラーが発生した場合はステータスビットを設定し、ユーザがIsOK()を呼び出して実際に構築が行われたかどうかを確認させる方法です。

しかし、これは、と考えられています。廃止されました。

ハーブは言う:

私は「コンストラクタはエラーが発生した場合、ステータス・ビットをセットし、ユーザーは、建設が実際に働いていたかどうかを確認するためにISOK()を呼び出してみましょう」が見つかり時代遅れする方法を、危険なています、退屈で、例外をスローするよりも優れていません。

1

例外をスローするのが普通の方法ですが、コンストラクタで例外をスローするパターンを避けることをお勧めします。

コンストラクタが例外をスローしないようにすることはできませんが、コンストラクタによってスローされた例外に依存するアンチパターンと思われます。 微妙な違いがあります。

私は通常失敗しないコンストラクタを扱い、値を返すか例外をスローするInitializeメソッドで失敗する可能性のある賢明なロジックを移動することを好みます。

コードがもっと複​​雑になると、よりクリーンで、頭痛を避けることができます!

これは私がそうblieve理由の一例です:AIXは説明したようにhttp://www.cs.technion.ac.il/~imaman/programs/throwingctor.html

もう一つの興味深い記事がコンストラクタから投げることだけ賢明な選択肢である、C++ : handle resources if constructors may throw exceptions (Reference to FAQ 17.4]

+0

私はdownvoteしませんでしたが、あなたはいつも失敗することができないコンストラクタを書くことはできません。私はあなたがSymbianが使用するTwo Phased Constructionに対して2つのヒントを思いついていると思います。 –

+0

はい、必ず失敗することはできないコンストラクタを書くことはできませんが、私の考え方からは、コンストラクタによってスローされた例外に頼るのを避けるための良い方法です。例はもちろんメモリ不足です。 –

+0

私は2つの段階的な構築アプローチのように認めなければなりません。すべてのクラスではなく、ファイルや大量のメモリやインターネット接続を扱うクラスでは、私にとって最善の選択です。私はSymbianがこのアプローチを使用しているかどうか分かりませんでしたが、多くの言語とライブラリ(C++、C#、Java)で使用されています。 –

1

です。

また、あなたはコンストラクタイディオム名前を使用することができます(herehereを参照)、新しいオブジェクトの作成が失敗に終わる場合はnullポインタを返します。

+1

合意。あなたは2相構成を取らなければならない場合、あなたのコンストラクタのアクセシビリティを減らし、 "名前付きコンストラクタ"を使ってオブジェクトを作成するのが最善です。欠点 - ほとんどの実装はヒープ割り当てに依存しています(ただし、これは欠点ではありません)。 –

関連する問題