0

Я не уверен, что вопрос уместен, но я постараюсь изо всех сил.как выбросить исключение, если в унаследованном классе нет конструктора?

Это моя домашняя проблема. Домашнее задание попросит меня сделать исключение, если две строки параллельны или равны.

Исходные коды предоставлены моим профессором, и моя задача - изменить его, чтобы он смог исключить исключение.

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', то есть' class RuntimeException: public std :: exception {...}; ' – PaulMcKenzie

+0

@PaulMcKenzie. Почему они должны выводиться из' std :: exception'? – 0x499602D2

ответ

5

Поскольку у вас есть спецификатор исключения, вы можете бросить только EqualLines или ParallelLines. Эти типы исключений не имеют конструктора по умолчанию (их базовый тип не имеет конструктора по умолчанию) и не имеют других конструкторов. Единственный способ построить любое из этих исключений - скопировать существующий. Невозможно выбросить одно из этих исключений без изменения заголовков или нарушения стандарта. Я бы посоветовался с профессором, это мне кажется ошибкой.

В общем, спецификаторы исключений - плохая идея. See this answer. На самом деле они устарели.

+0

Многие из моих одноклассников уже консультировались с профессором и ТП, но вот что они сказали нам так далеко. –

+1

Его назначение неполноценно. Вы должны выбрать либо нарушить правила назначения, либо правила языка. –

+0

Вот что говорит ТА: «Так как часто спрашивают, вот подсказка, которую я могу предоставить: Опять же, два унаследованных класса EqualLines и ParallelLines получены из суперкласса RuntimeException. Когда доктор Тинделл сделал комментарий к коду, все переменные-члены и функции-члены (в том числе конструктор), которые вам нужны, наследуются от суперкласса RuntimeException, потому что тело как EqualLines, так и ParallelLines листы пустые. Другими словами, независимо от функциональности суперкласса эти два унаследованных класса имеют их все «. –