2016-08-25 37 views
0

考虑从基本结构Geometry继承的两个几何图形TriangleLine。派生结构继承虚函数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

听起来就像你需要一个'多边形'类成员的'线'类,然后你可以从'多边形'派生出你的形状。 – NathanOliver

回答

0

假设你保持当前的设计,尽管勒夫Pileborg解释的缺陷:

一种可能实现的方法是:

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

动机:

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

但是,在常规版本构建中,断言被停用。 return 0.;确保返回有意义的东西。
(注意:这可能会改变你如何使用面积值,NAN可能是一个不错的选择)。

注:

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

  • 获取调用方,即仅从代码调用堆栈C++比Java等语言更难。获取它是实现定义的,并且获取方法的可读名称。但是,处于调试模式+具有调试器(大多数IDE都是这种情况)可以让您轻松做到这一点。