質問が適切かどうかはわかりませんが、私は最善を尽くします。継承されたクラスにコンストラクタがないときに例外をスローする方法は?
これは私の宿題の問題です。 宿題では、2本の線が平行または等しい場合に例外をスローするように求められます。
元のコードは私の教授が提供しています。私の仕事は例外をスローするように修正することです。
line.h
class RuntimeException{
private:
string errorMsg;
public:
RuntimeException(const string& err) { errorMsg = err; }
string getMessage() const { return errorMsg; }
};
class EqualLines: public RuntimeException{
public:
//empty
};
class ParallelLines: public RuntimeException{
public:
//empty
};
class Line{
public:
Line(double slope, double y_intercept): a(slope), b(y_intercept) {};
double intersect(const Line L) const throw(ParallelLines,
EqualLines);
//...getter and setter
private:
double a;
double b;
};
教授は.cppファイルをmodifedすることができ、ヘッダファイルを変更しないように私たちに語りました。
line.cpp
double Line::intersect(const Line L) const throw(ParallelLines,
EqualLines){
//below is my own code
if ((getSlope() == L.getSlope()) && (getIntercept() != L.getIntercept())) {
//then it is parallel, throw an exception
}
else if ((getSlope() == L.getSlope()) && (getIntercept() == L.getIntercept())) {
//then it is equal, throw an exception
}
else {
//return x coordinate of that point
return ((L.getIntercept()-getIntercept())/(getSlope()-L.getSlope()));
}
//above is my own code
}
これら二つの継承されたクラスは、それゆえerrorMsg
を初期化するコンストラクタ空ではない、また私は、例外をスローするためにこれらのクラスのオブジェクトを作成することができるので。これを達成するための代替ソリューションはありますか?
あなたが投稿したコードは、古い 'throw'仕様を使用しています。それらを削除し、関数が何もスローしない場合は新しく最新の 'noexcept'指定子を使用し、それ以外は何も使用しないでください。あなたの場合は、教授にこの古くからのテクニックを使わないように教えてください – Rakete1111
*教授はヘッダーファイルを変更しないように教えてくれました。.cppファイルだけを変更することができます。* - あなたの教授は、 'std :: exception'から派生するもの、つまり' class RuntimeException:public std :: exception {...}; ' – PaulMcKenzie
@PaulMcKenzieなぜ' std :: exception'から派生するのですか? – 0x499602D2