。 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. はIllegalArgumentExceptionが/私は、次のコードを持っているブロック
- 4. 、私は次のコードを持っている変数のショートカットに
- 5. Plotdevice、私は次のコードを持っている変数
- 6. I次のコードを持っているボトム
- 7. IはNode.jsのアプリケーションで次のコードを持っているノードlibcurlの
- 8. 例外:変数iがミュールポール/ウォーターマークに次の例外をgetingい
- 9. はDbUpdateException iは、次のレジスタアクションメソッドを持っている私のコントローラメソッド
- 10. jQueryのチェックボックスマルチIは、複数のチェックボックスを選択するための次のコードを持って
- 11. は、私は次のPHPコードを持って戻ってMySQLの
- 12. :ネストされたsIFR要素Iは、次のHTMLを持って
- 13. は、私は次のコードを持っているjQueryを使ってテキストやチェックボックスの値の取得と変数
- 14. PHPの変数は、私は次のセットアップを持っている
- 15. 使用する変数は、私は次のクエリを持って
- 16. コードイグナイタアクティブレコード - Iは、MySQL 5.1で次のスキーマを持つテーブルを持っているポイントカラム
- 17. 私は次のコードで変更したXMLファイル持って
- 18. クラスI date_selectの次使用を持っている効果
- 19. 私はこのコードを持っているこの変数
- 20. タイムゾーンの変換は、私は次のコードを持っている日付値
- 21. NHibernateのQueryOverは、私は、次のNHibernateのコードを持って
- 22. 、私は次のコードを持っているすべてのインスタンスメソッドパターン
- 23. は、私は次のコードを持って、前後のAppDomain
- 24. は、私は次のコードを持っているエンティティの作成
- 25. は、私は次のコードを持っているのPython
- 26. は、私は次のコードを持っているjQueryのコールバック
- 27. は、私は、次のコードを持っているJavaの
- 28. アレイのFileInfo []は、私は次のコードを持っているファイル
- 29. のSQLite Pythonは、私は次のコードを持っているテーブル
- 30. は、私はPythonで、次のコードを持っているNode.jsの
「try」ブロックに入れてみませんか?例外をスローすると、とにかく「終了」します。 – MatthewRock
質問は意味をなさない: 'a'の構築が例外を投げた場合、' a'はとにかく役に立たない。 –
'catch 'には後にstuffが必要です。 'catch(...)' –