2017-01-21 3 views
0

まず、私は実際にgoogleですばやく検索を行いましたが、私が何を撮影しているのか説明していませんでした。std :: runtime_errorから派生する方法:基本クラス情報にアクセスするには?

編集:たとえば、私はhereを見ました。

クラスstd::runtime_errorは、実行時に発生するエラーを通知する例外クラスです。私が間違っていない限り、デフォルトのコンストラクタはありません(親コンストラクタを明示的に呼び出さなくてもそれから派生しようとするとエラーが出ます)が、メッセージを指定できるstring(-ish)コンストラクタがあります。

私の質問は、what()(仮想関数std::exception)のようなメンバー関数で、そのメッセージにどうやってアクセスしたいのですか?親クラスにgetMessage()または同様の関数が定義されておらず、what()を呼び出すのは、私がオーバーライドしている関数の場合はむしろ役に立たない。

私はVisual Studio Community 2015を使用していますので、コンパイラ固有の方法は問題ありませんが、私はポータブルソリューションを好むでしょう。

+0

_「オーバーライドしている機能であれば、what()を呼び出すのはむしろ役に立たない」という意味ですか? –

+0

私は、[この質問はあなたの答えです](http://stackoverflow.com/questions/41753358/creating-custom-exceptions-in-c/) – andrgolubev

答えて

2

したいことを指定し、基本クラスのwhatの代わりに、あなた自身:

const char* what() const noexcept override { 
    auto base_msg = std::runtime_error::what(); 
    return /* something using base_msg */; 
} 

しかし、constnoexceptに忠実に保ち、また、データへのポインタを戻しながらずっとあなたが本当にwhatに行うことができますがありません関数呼び出しよりも寿命が長くなります。コンストラクタでフォーマットを行い、クラスに含まれるバッファを返すことができます。あなたが例外をスローしようとしている間に最後に望むことは別のエラーであることに気をつけてください。

関連する問題