2016-08-25 64 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都是這種情況)可以讓您輕鬆做到這一點。