0

질문이 적절하지는 않지만 최선을 다할 것입니다.상속 된 클래스에 생성자가 없을 때 예외를 throw하는 방법은 무엇입니까?

이것은 숙제 문제입니다. 숙제는 두 줄이 평행하거나 같으면 예외를 던져달라고 부탁합니다.

원래 코드는 내 교수가 제공하고 나의 일은 예외를 던질 수 있도록 수정하는 것입니다.

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 파일이 약간 변형 될 수 있으며, 헤더 파일을 수정하지 우리에게 말했다.

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'에서 파생됩니다. 즉,'RuntimeException : public std :: exception {...};' – PaulMcKenzie

+0

@PaulMcKenzie'std :: exception'에서 왜 파생되어야합니까? – 0x499602D2

답변

5

예외 지정자가 있으므로 EqualLines 또는 ParallelLines 만 던질 수 있습니다. 이러한 예외 유형에는 기본 생성자가 없으며 기본 유형에는 기본 생성자가 없으며 다른 생성자가 없습니다. 이러한 예외 중 하나를 구성하는 유일한 방법은 기존 예외를 복사하는 것입니다. 헤더를 수정하거나 표준을 위반하지 않고 이러한 예외 중 하나를 포기하는 것은 불가능합니다. 나는 교수님과상의 할 것이고, 그것은 나에게 실수 인 것처럼 보입니다.

일반적으로 예외 지정자는 나쁜 생각입니다. See this answer. 그들은 실제로 더 이상 사용되지 않습니다.

+0

내 급우의 많은 이미 교수 및 TA와 상담하지만 여기에 그들이 우리에게 지금까지. –

+1

그의 과제물에 결함이 있습니다. 과제의 규칙이나 언어의 규칙을 위반하도록 선택해야합니다. –

+0

다음은 TA가 말하는 것입니다 : "자주 묻기 때문에 여기에 내가 제공 할 수있는 힌트가 있습니다 : 두 개의 상속 된 클래스 EqualLines과 ParallelLines는 RuntimeException 슈퍼 클래스에서 파생됩니다 .Tindell 박사가 코드에 대해 언급 한대로 모두 EqualLines와 ParallelLines의 본문이 공백으로 남겨지기 때문에 필요한 수퍼 클래스 인 RuntimeException에서 멤버 변수와 멤버 함수 (생성자 포함)가 상속됩니다. 즉, 수퍼 클래스의 기능이 무엇이든이 두 상속 된 클래스는 모두 . " –