在虚函数中给出错误

时间:2016-08-25 11:28:30

标签: c++ error-handling virtual-functions

考虑从基础结构Triangle继承的两个几何LineGeometry。派生结构继承虚拟函数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. */}
};

1 个答案:

答案 0 :(得分:0)

假设你保持现有设计,尽管Joachim Pileborg解释了这个缺陷:

该方法的可能实现是:

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

动机:

在调试模式下,如果条件为false,assert(condition);将退出程序。假设你有你的IDE&调试器,您将能够看到谁调用了该方法。

但是,在常规发布版本中,断言已停用。 return 0.;确保返回有意义的内容 (注意:这可能会因您使用区域值的方式而改变.NAN可能是一个不错的选择。)

注意:

  • 问题必然会在运行时弹出,因为您使用的是虚拟方法。这是一种设计气味,可以通过多种方式解决(将线的区域定义为0,创建中间类Shape1D和Shape2D,......)

  • 获取调用者,即仅从代码调用堆栈在C ++中比Java之类的语言更难。获取它是实现定义的,以及获取方法的人类可读名称。但是,处于调试模式+具有调试器(大多数IDE都是这种情况)允许您轻松地执行此操作。