0

質問が適切かどうかはわかりませんが、私は最善を尽くします。継承されたクラスにコンストラクタがないときに例外をスローする方法は?

これは私の宿題の問題です。 宿題では、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を初期化するコンストラクタ空ではない、また私は、例外をスローするためにこれらのクラスのオブジェクトを作成することができるので。これを達成するための代替ソリューションはありますか?

+2

あなたが投稿したコードは、古い 'throw'仕様を使用しています。それらを削除し、関数が何もスローしない場合は新しく最新の 'noexcept'指定子を使用し、それ以外は何も使用しないでください。あなたの場合は、教授にこの古くからのテクニックを使わないように教えてください – Rakete1111

+2

*教授はヘッダーファイルを変更しないように教えてくれました。.cppファイルだけを変更することができます。* - あなたの教授は、 'std :: exception'から派生するもの、つまり' class RuntimeException:public std :: exception {...}; ' – PaulMcKenzie

+0

@PaulMcKenzieなぜ' std :: exception'から派生するのですか? – 0x499602D2

答えて

5

例外指定があるため、EqualLinesまたはParallelLinesしか投げることができません。これらの例外タイプにはデフォルトのコンストラクタがありません(その基本タイプにはデフォルトのコンストラクタがありません)。他のコンストラクタはありません。これらの例外のいずれかを構築する唯一の方法は、既存のものをコピーすることです。ヘッダーを修正したり、標準に違反したりすることなく、これらの例外を投げることは不可能です。私は教授と相談しますが、それは私の間違いのようです。

一般に、例外指定子は悪い考えです。 See this answer。実際には非難されています。

+0

私のクラスメートの多くはすでに教授とTAと相談しましたが、これまでのところ。 –

+1

彼の課題は不良です。あなたは、割り当てのルールまたは言語のルールを解除するかを選択する必要があります。 –

+0

TAはこう言っています: "よく聞かれるので、ここに私が提供できるヒントがあります: また、2つの継承クラスEqualLinesとParallelLinesはスーパークラスRuntimeExceptionから派生しています。つまり、必要なメンバ変数とメンバ関数(コンストラクタを含む)は、スーパークラスRuntimeExceptionから継承されます。これは、EqualLinesとParallelLinesの両方のボディが空白になっているためです。 " –

関連する問題