0

どうすればいいですか、

最大20桁の数を格納するLargeIntegerというクラスがあります。コンストラクタを作りました

LargeInteger::LargeInteger(string number){ init(number); }

数値が > LargeInteger::MAX_DIGITS (静的 const メンバー)、つまり 20 の場合、オブジェクトを作成せずに例外をスローします。

クラス LargeIntegerException{ ... }; を作成しました。そしてこれをした

void init(string number) throw(LargeIntegerException);
void LargeInteger::init(string number) throw(LargeIntegerException)
{
    if(number.length > MAX_DIGITS)
    throw LargeIntegerException(LargeIntegerException::OUT_OF_BOUNDS);
    else ......
}

だから今私はコンストラクタを変更しました

LargeInteger::LargeInteger(string number)
{ try {init(number);} catch(LargeIntegerExceptione) {...} }

ここで 2 つの質問が
あります。1. 例外がスローされた場合、このクラスのオブジェクトは作成されますか?
2.上記の場合、どのように対処しますか?

4

2 に答える 2

4

いいえ、コンストラクターで例外がスローされた場合、オブジェクトは構築されません (キャッチしない限り)。

したがって、例外をキャッチしないで、呼び出し元のコンテキストに伝播させます。

IMO、これは正しいアプローチです。オブジェクトを直接初期化できない場合は、コンストラクターで例外をスローし、オブジェクトを作成しないでください。

于 2012-07-28T00:53:51.573 に答える
1

コンストラクターで例外をキャッチする理由はありません。コンストラクターを失敗させたいので、コンストラクターの外側の何かがそれをキャッチする必要があります。コンストラクターが例外によって終了した場合、オブジェクトは作成されません。

LargeInteger(string num) { init(num); } // this is just fine.
于 2012-07-28T01:04:35.887 に答える