2

入力引数が範囲外の場合に例外がスローされる可能性のあるいくつかのことを実行する小さなライブラリを作成しています。std::out_of_rangeをスローするのは簡単なようです。

また、「Xを指定しましたが、Yは範囲内の最大値です」などのメッセージを生成したいと思います。つまり、文字列をフォーマットしていて、それを例外に使用したいと思います。

奇妙なのは、コンストラクターの署名が

explicit out_of_range (const string& what_arg)

つまり、文字列へのconst参照を取ります。スタック上に作成した文字列は、関数から飛び出すときに破棄され、例外のキャッチャーのためにゴミの山が壊れたままになります。だから私にはいくつかの選択肢しかありません:

  1. 文字列リテラルを使用するので、適切に生成されたメッセージはありません。プログラムの存続期間中有効です。
  2. 関数内で文字列を静的にし、スローされたときに書き直します。スレッドセーフは私のプログラムの問題ではありませんが、これはかなり汚い感じがします。
  3. 文字列のコピーを取得するようにout_of_rangeをサブクラス化し、コピーへの参照を使用してスーパークラスコンストラクターを呼び出し、例外オブジェクトの存続期間中コピーが存在するようにします。

とにかく標準クラスを直接使用するよりも、グロスが最も少なく、おそらくより良い設計として3に傾いていますが、質問する必要があります。生成された文字列で標準のout_of_rangeクラスを直接使用する方法は本当にありませんか?私は何かが足りないのですか?

4

3 に答える 3

6

例外は、参照だけでなく、渡した文字列のコピーを保持します。文字列をローカルで安全に作成し、存続期間の問題を心配することなく、例外のコンストラクターに渡すことができます。

文字列が参照によって渡されるという事実は、コンストラクター内でコピーする可能性を妨げないことに注意してください。これは、混乱しているようです。

于 2012-08-13T20:58:48.573 に答える
3

あなたの仮定は間違っています。このクラスを想像してみてください。

struct Foo
{
    std::string s;
    Foo(std::string const & str) : s(str) { }
};

Foo a(std::string("hello"));コンストラクターを見て、ぶら下がっている参照を作成すると結論付けることができますか?

于 2012-08-13T20:59:06.280 に答える
1

あなたのwhat_arg引数は、ctorの例外のメンバーにコピーされます。

于 2012-08-13T21:01:51.707 に答える