私は例外を除いて問題ました:例外&Cスタイルの文字列
#include <iostream>
#include <cstring>
#include <exception>
class except :public std::exception
{
char* err;
public:
except(const char* s) noexcept
{
err = new char[strlen(s) + 1];
strcpy(err, s);
err[strlen(s)] = 0; //is it necessary??
}
virtual const char* what() noexcept
{return err;}
virtual ~except() noexcept
{delete err;}
};
double div(const double& a, const double& b) noexcept
{
if (b == 0.0)
throw except("DIVIDED BY 0");
return a/b;
}
int main()
{
try
{
std::cout << div(5.0, 0.0);
}
catch (std::exception &ex)
{
std::cout << ex.what();
}
return 0;
}
を私は「0で除算し、」印刷したいが、私は得る:
terminate called after throwing an instance of 'except'
what(): std::exception
Aborted
Process returned 134 (0x86)
は、私はすべての機能にnoexcept
を入れましょう/例外をスローしないメンバ関数?
err[strlen(s)] = 0
は必要ですか? (中(のconstのchar * sで)を除く以外::)
?より良い:std :: runtime_errorから派生します。 –
1)C文字列は何ですか?それらはヌルで終了する文字列です。 "[std :: strcpy](http://en.cppreference.com/w/cpp/string/byte/strcpy)以降、実際にはありません" _Is 'err [strlen(s)] = 0'が必要ですか?文字列をコピーするときにそれを含みます。しかし、そのような行は害を及ぼさない。 2) 'delete err;'は未定義の動作です。それは 'new []'で 'new'されたので、' delete [] err; 'として削除する必要があります。 –
あなたは例外を使用していますが、これはC++のやや中級から上級のトピックですが、Cスタイルの文字列を使用しています。どうして? – PaulMcKenzie