1

これはインタビューの質問です。インタビューは行われました。

クラス B と C のメンバーを持つクラス A を考えます。クラス C のコンストラクターで例外が発生しても、プログラムは正常に動作する場合、その理由は何ですか?

私の答え:

クラス C のコンストラクターは A によって実装されていません。または、A には、クラス C に対して何らかの操作を実行する命令がありません。

クラス C にはインスタンス化がありません。

例外はエラーではありません。例外ハンドラー関数はそれをうまく処理します。

より良いアイデアはありますか?

ありがとう !

4

4 に答える 4

1

のインスタンスがCクラスのオプションのメンバーである場合、インスタンスAへのnull値のポインタを持つことCはOKです。そうすれば、適切な例外処理があれば問題ありません。

于 2012-05-27T15:17:48.110 に答える
1

のオブジェクトを正常に構築するには、そのメンバー(タイプおよびこの場合)Aを正常に構築している必要があります。プログラムが正しく動作している場合、それはオブジェクトの作成の失敗から回復できることを意味します。BCA

プログラムは、のコンストラクタからスローされた例外をキャッチしA、何らかの方法でエラー状況に対処している必要があります。

たとえば、別の構成値に基づいて、異なるパラメーターのセットをAのコンストラクターに渡すことができます(これにより、メンバーctorに異なるパラメーターが渡されます。これは現在はスローされません)。C

または、タイプのオブジェクトの作成を伴わない元の問題を解決するための代替パスがありましたA(たとえば、この代替パスは計算にコストがかかる可能性があり、それが最初の選択肢ではなかった理由である可能性があります)。

于 2012-05-27T15:17:54.190 に答える
1

私はそれがこの構文を参照していると思います:

 A::A() try : B(...),C(...) 
 {
    //A constructor body
 }
 catch(...) {}

編集は気にしないでください、catchブロックで明示的に再スローされないすべての例外は自動的に再スローされます

これを見る

于 2012-05-27T15:20:27.317 に答える
0

プログラムは、そのように設計されていれば動作し続けることができますが、ベースまたはメンバーのいずれかが初期化に失敗した場合、オブジェクトを完全に構築することはできないため、タイプAのオブジェクトの構築は失敗する必要があります。

クラスが所有するポインタによってオブジェクトを保持し、期待値が初期化子リストからエスケープされない限り、保持されたオブジェクトなしでオブジェクトを構築することは可能です。例えば

struct C {
    C();
};

struct A {
    A();
    std::unique_ptr<C> c;
};

A::A() {
    try {
        c.reset(new C);
    }
    catch (...){
        // oops. Can't re-throw, could log
    }
}
于 2012-05-27T15:17:43.243 に答える