2016-08-25 5 views
0

Рассмотрим две геометрии Triangle и Line которые наследуют от базовой структуры Geometry. Производные структуры наследуют виртуальную функцию get_area(), так что Triangle обычно вычисляет область, но Line должен сообщить об ошибке, указывающей, что get_area() не имеет отношения к Line. Когда отображается ошибка, я хотел бы знать, какая структура называется get_area() и где (номер строки) и, наконец, завершает работу программы. Не имеет значения, отображается ли ошибка при компиляции или времени выполнения. Как я могу это сделать?Ошибка при виртуальной функции

struct Geometry 
{ 
    virtual double get_area() = 0; 
}; 

struct Triangle: Geometry 
{ 
    double get_area() override {/* some code. */} 
}; 

struct Line: Geometry 
{ 
    double get_area() override {/* give error. */} 
}; 
+6

Возможно, вам нужно переосмыслить свой дизайн? Или ваша реализация, по крайней мере? Если строки не имеют области, то класс 'Line' не должен * иметь * такую ​​функцию? –

+0

Похоже, вам нужен класс 'line', который является членом класса« polygon », а затем вы можете получить« polygon », чтобы сделать ваши фигуры. – NathanOliver

ответ

0

Если предположить, что сохранить текущий дизайн, несмотря на недостаток объясняется Joachim Pileborg:

Возможная реализация для метода:

double Triangle::get_area() override 
{ 
    assert(false); 
    return 0.; 
} 

мотиваций:

В режиме отладки , assert(condition); выйдет из программы, если условие ложно. Предполагая, что у вас есть IDE & отладчик, вы сможете узнать, кто вызвал этот метод.

Однако в регулярной версии сборки утверждения деактивируются. return 0.; обеспечивает то, что имеет смысл, возвращается.
(Примечание: это может быть изменено тем, как вы используете значение области. NAN может быть хорошим выбором).

Примечание:

  • вопрос будет обязательно всплывает во время выполнения, потому что вы используете виртуальные методы. Это дизайнерский запах, который может быть решен несколькими способами (определяя площадь строки как 0, создавая промежуточные классы Shape1D и Shape2D, ...)

  • Получение звонящего, то есть стек вызовов из кода только сложнее в C++, чем такие языки, как Java. Получение его определяется реализацией, а также получение человеко-читаемых имен методов. Однако, находясь в режиме отладки + с отладчиком (что имеет место с большинством IDE), вы можете сделать это безболезненно.

Смежные вопросы