私は初心者ですので、この愚かな質問のためにお詫び申し上げます。私はstackoverflowで同様の答えを見つけることができないので、私はここにそれを掲示しています。カスタム例外のメソッド/コンストラクタシグネチャにthrow()がある場合とない場合
私はC++で例外を進行して、私はカスタム例外を除いて、上のいくつかの手をしていたとして、私は上記のコードは、教師によって示された、このコード
class MyException: public std::exception{
public:
virtual const char* what() const throw() {
return "something bad happened";
}
};
// class that throws above exception
class canGoWrong {
public:
canGoWrong(){
throw MyException();
}
};
を持っています。コンストラクタは、基本クラスexception
で定義された仮想関数を実装しました。私はそこまでたどり着いた。
私は別のバージョンを練習しようとしていましたが、仮想を再定義する代わりにカスタム関数を使用しようとしました(C++はインターフェイスのコンセプトを厳密には実施しません。 。)
私は両方の方法で動作の違いを見つけることができませんでしたが、要約すると
class my_custom_shit_exception: public std::exception {
public:
const char* show() { // I omitted the const throw() here
return "This is an error encountered\n";
}
};
class myclass {
public:
myclass() {
throw my_custom_shit_exception();
}
};
としてそれを書いた
public:
const char* show() {
return "This is an error encountered\n";
}
virtual const char* what() const throw() {
return "something bad happened";
}
- なぜ
const throw()
はwhat()
仮想機能で使用されましたか?どのような違いがありますか?
ありがとうございます。
"C++は厳密にインターフェイスの概念を強制していないため、"あなたが意図したものなら、それは純粋仮想関数用です。 – tkausl
あなたが省略したthrow()は '例外仕様'です。コンパイラに関数が例外をスローしないこと、 'what()'関数、つまりこれを強制するとは言いません。わかりやすくするために、例外仕様を読んでください。 –
非常に興味深い質問です。それは同じ質問ではありませんが、私は[これは役に立つ]と思う(https://stackoverflow.com/questions/5230463/what-does-this-function-declaration-mean-in-c) – user1754322