。 ClassAにデフォルトのコンストラクタがなく、ポインタを使用したくないとすれば、どうすれば実現できますか? ClassA
にデフォルトのコンストラクタを追加する唯一の方法はありますか?アクセス変数Iは、次のコードを持って外のtry-catchブロックを
答えて
あなたはそうすることはできません。代わりに、あなただけのtry
ブロック内でそれを使用することができ、何かのように:あなたはポインタを持っている場合
try
{
ClassA a = ClassA(s);
std::string result = a.GetSomething();
}
catch(...)
{
//Do something
exit(1);
}
理由(オブジェクトを参照するtry
ブロックの後にスコープ外になるa
ので、それは未定義の動作がされた後ということですそれがどこにあったか)。
あなたがa.GetSomething
または割り当てthrow
Sに関係している場合は、その周りのtry-catch
を置くことができます:
try
{
ClassA a = ClassA(s);
try {
std::string result = a.GetSomething();
}
catch(...) {
// handle exceptions not from the constructor
}
}
catch(...)
{
//Do something only for exception from the constructor
exit(1);
}
あなたはoptional
のいくつかの並べ替えを使用するか、単にstd::unique_ptr
を使用することができます。もちろん
int main()
{
std::string s = "";
std::unique_ptr<ClassA> pa;
try
{
pa.reset(new ClassA(s));
}
catch
{
//Do something
exit(1);
}
ClassA& a = *pa; // safe because of the exit(1) in catch() block
std::string result = a.GetSomething();
//Some large amount of code using 'a' out there.
}
、ちょうどa
の使用を含むようにtry
ブロックを拡張は、最も単純な解決策です。
また、実際にexit(1)
に計画していた場合、または失敗した場合にプログラムを中止した場合は、try
ブロックをここに配置しないでください。例外が伝播し、プログラムがキャッチされない場合は中止されます。
std::optional
を使用することもできます。これはポインターを使用するのと同じ概念ですが、自動割り振りを使用するため、メモリーリークを起こす可能性は低くなります。これは現在実験ステータスです。
#include <experimental/optional>
using std::experimental::optional;
using std::experimental::in_place;
// ...
optional<ClassA> a;
try
{
a = optional<ClassA>(in_place, s);
}
catch(...)
{
// display message or something
}
std::string result;
if (a)
result = a->GetSomething();
これはスパゲッティスタイルのビットであり、あなたのように、異なったあなたのコードを設計する方が良いだろうとけれども、私は改めてしたい:あなたのコンパイラがstd::experimental::optional
を持っていない場合、代わりにboost::optional
を使用することができます建設が成功したか失敗したかを継続的にテストしていません。
ClassA
は、移動またはコピー可能である必要があります。 in_place
は、残りの引数に対して完全な転送コンストラクタを呼び出す特殊な引数です。 in_place
を指定しないと、コンストラクターの引数として実際にClassA
しか指定できません。暗黙の変換はClassA
には考慮されません。 (これは、optional
が同じタイプのオブジェクトからのコピー構築とリスト初期化のあいまいさを避ける方法です)。
- 1. Groovyのを待つ/ Iは次のGroovyコードを持って
- 2. 変数iが、私はこのコードを持ってコンパイル時
- 3. メイクキャッシュオブジェクトIは、次のコードを持って深夜
- 4. はIllegalArgumentExceptionが/私は、次のコードを持っているブロック
- 5. VBA変数は、私は次のコードを持っている
- 6. 、私は次のコードを持っている変数のショートカットに
- 7. I次のコードを持っているボトム
- 8. Plotdevice、私は次のコードを持っている変数
- 9. jQueryの変数Iは、PHPファイルと、このコードを持っている
- 10. 例外は、私は次のコードを持って反復
- 11. 私は、次のコードを持っている外部のURL
- 12. IはNode.jsのアプリケーションで次のコードを持っているノードlibcurlの
- 13. 例外:変数iがミュールポール/ウォーターマークに次の例外をgetingい
- 14. 私は次のコードを持ってクリック
- 15. はDbUpdateException iは、次のレジスタアクションメソッドを持っている私のコントローラメソッド
- 16. Javaは私がプリミティブラッパークラスを持って、次のコード持ってカッコ
- 17. 私はLaravelによって返され、次のコードを持って、次のコード
- 18. jQueryのチェックボックスマルチIは、複数のチェックボックスを選択するための次のコードを持って
- 19. String.Replace()私は私のC#アプリケーション内の次のコードを持っている変数
- 20. 数($ nameArrayは)私は、次のコードを持って正しい値
- 21. malloc関数は、私は次の簡単なコードを持って
- 22. ユニティ:私は次のコードを持っているの引数
- 23. はthis.state変数では、私が反応し、次のコードを持っている
- 24. Haskellは:私はHaskellで、次のコードを持っている変数
- 25. ジェンキンスパイプラインステップを構築 - getBuildVariables()I試験Jenkinsfileで次のコード持って空のマップ
- 26. hex2chars&Iは、関数hex2charsを持って
- 27. は、私は次のPHPコードを持って戻ってMySQLの
- 28. :ネストされたsIFR要素Iは、次のHTMLを持って
- 29. パンダ:私は、次のコードを持って、集計関数
- 30. コードは、私は次のコードを持っている別の1
「try」ブロックに入れてみませんか?例外をスローすると、とにかく「終了」します。 – MatthewRock
質問は意味をなさない: 'a'の構築が例外を投げた場合、' a'はとにかく役に立たない。 –
'catch 'には後にstuffが必要です。 'catch(...)' –