1

直観は、スローされた型が単純であるほど良いことを教えてくれます。ポインターよりも int をスローする方が適切であり、クラスよりも構造体をスローする方が適切です。この場合、動的に割り当てられたメンバーを持つほぼ完全なクラスをスローする必要があります。バッファが非常に長くなり、コピーにコストがかかる可能性があるため、ヒープにメモリを割り当てると便利です。他のオブジェクトの制御/引数構造体として機能するため、メソッドを持つ必要はありませんが、構造体へのポインターをスローするためにヒープに構築することと、メモリをクリーンアップするためのデストラクタを持つことの両方が便利です。単純なほど良いので、デストラクタは仮想にする必要がありますか? vtable を省略した方が良いですか、それともvtables は例外の受け渡しにまったく影響しませんか?

この構造体からクラスを基本クラスとして派生させる利点は、ポリモーフ メソッドではなく、データを追加することです。ポインターは、例外ポイントから数層先でキャッチされ、モジュール間で渡される可能性があるため、オブジェクトは可能な限りクリーンに動作し、エラーを複合するリスクを可能な限り少なくする必要があります。

4

2 に答える 2

1

std::exception を見て、それを継承してください。

デストラクタは、クラスを基本クラスとして使用することが予想される場合にのみ仮想にする必要があります。

于 2011-04-21T22:51:48.493 に答える
1

仮想デストラクタは、基本クラスへのポインタを介してオブジェクトを削除する場合にのみ必要です。例外タイプの場合、それらを動的に作成するのではなく、値によってスローする必要があります。そのため、基本クラスのポインタなどを介してそれらを削除する必要はなく、仮想デストラクタも必要ありません。

そうは言っても、あなたが言及した動的に割り当てられたデータと比較して、また例外をスローするコストと比較して、v-table のコストは小さいため、最適化する必要性が証明されていない限り、常に効率よりもユーティリティを優先する必要があります。 . std::exceptionコードと標準ライブラリ (および他のライブラリ) の両方によってスローされたエラーを統一された方法で処理できるように、すべての例外タイプを から派生させることをお勧めします。これには、既に仮想関数 (what()メッセージ文字列を返す) と仮想デストラクタがあります。

于 2011-04-22T00:02:39.853 に答える