2016-08-25 3 views
0

TriangleLineの2つの図形を、基本構造Geometryから継承したとします。派生構造体は、仮想関数get_area()を継承し、Triangleは通常は面積を計算しますが、Lineget_area()Lineに関連しないことを示すエラーを返すはずです。エラーが表示されたら、どの構造体がget_area()と呼ばれていてどこに(行番号)最後にプログラムを終了するのか知りたいです。コンパイル時または実行時にエラーが表示されるかどうかは関係ありません。どのようにすればいいのですか?仮想関数にエラーが発生する

あなたのヨアヒムPileborgによって説明欠陥にもかかわらず、現在のデザインを保つと仮定すると、
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

あなたのデザインを再考する必要はありますか?少なくともあなたの実装は? linesに領域がない場合、 'Line'クラスはそのような関数を持つべきではありませんか? –

+0

'polygon'クラスのメンバである' line'クラスが必要であり、 'polygon'から派生してあなたのシェイプを作ることができるように思えます。 – NathanOliver

答えて

0

の方法の可能な実装は次のとおりです。

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

動機:

デバッグモードで、条件がfalseの場合、assert(condition);はプログラムを終了します。あなたのIDE &デバッガを持っていると仮定すると、誰がそのメソッドを呼び出したかを見ることができます。

ただし、通常のリリースビルドでは、アサーションは無効になっています。 return 0.;意味のあるものが返されることを保証します。
(注:これはエリア値の使用方法によって変更される可能性がありますが、NANが良い選択肢かもしれません)。

注:

  • あなたは仮想メソッドを使用しているので、問題は必ずしも、実行時にポップアップ表示されます。これは、いくつかの方法(線の領域を0として定義し、中間クラスShape1DとShape2Dを作成する...)で解決できるデザインの匂いです。 Javaのような言語よりもC++で難しい。それを取得することは、実装が定義し、人間が判読可能なメソッドの名前を取得することです。しかし、デバッグモード+デバッガ(これはほとんどのIDEの場合)にあるので、苦労せずに行うことができます。

関連する問題