2012-03-14 10 views
5

私はexprが、このような公共インタフェース持つクラスにする必要がありますでしょう、ユーザーは「++ 233 123 + 45分の23」のようなExprにオブジェクトを構築するために無効な文字列を入力した場合、設計では構文的には有効ですが、論理的に無効な引数をコンストラクタに渡して処理する方法はありますか?

class Expr{ 
    //... 
public: 
    Expr(const char*); 
    int eval();   //Evaluates the expression and gives the result 
    void print(); 
}; 

を最初にオブジェクトを構築し、そのオブジェクトに対してeval()が呼び出されたときにエラーを通知するのが正しいでしょう。

または、その時点でエラーをチェックして例外をスローする必要がありますが、実行時に重大な問題が発生します。そして、ユーザーはObjectが作成されたという前提でコードを書くかもしれません。実行時にエラーを発見するだけです..

このような問題は常にクラスを作成する際に発生します。 ????

+0

コンストラクタで直接式を評価しますか? – ApprenticeHacker

+1

[こちら](http://stackoverflow.com/questions/1158410/how-to-handle-incorrect-values-in-a-constructor)を参照してください。また、あなたのコンストラクタを '明示的に 'マークすることを検討してください。 –

+0

また、その目的のために静的関数として他の効率的なコードを使用していますが、どちらも意味します。 – bhuwansahni

答えて

5

これを行う方法の唯一の標準的な部分は完全なドキュメントです。

可能な限り早くエラーを投げたり、このタイプのオブジェクト(特定の引数を初期化する必要があるオブジェクト)のファクトリを使用する方が好きです。工場を使用する場合は、NULLまたはnullptrなどを返すことができます。

eval()が呼び出されたときにのみ、オブジェクトの作成時にエラーが表示されず、エラーが返されます。ポイントは何ですか?とにかくオブジェクトは無効です、なぜあなたはそれを使用するまで待っていますか?

例外がスローされることがありますが、これは実行時に深刻な増加を引き起こしますが、 です。

プロファイルしましたか?実行時の増加を想定しているため、例外を使用しないでください。

+2

"失敗する必要があるときは、騒々しく、できるだけ早く失敗します。 – bkconrad

+0

私はランタイムの増加につながるチェックを意味します – bhuwansahni

+2

@bhuwansahni:なぜですか?式は_some_ステージで有効性をチェックする必要があります。 – Mankarse

5
class illogical_expression_exception : public virtual exception {}; 

class Expr{ 
    //... 
    int result; // store evaluated result. 
public: 
    explicit Expr(const char*); 
    int getResult();   // Evaluate & Parse in the Constructor. 
    void print(); 
}; 

/* in constructor */ 

if (! checkExpression(expr)) throw illogical_expression_exception(); 

/* in main() */ 
try{ Expr my_expr("2+2*2"); } 
catch(const illogical_expression_exception& e){ 
    cout << "Illogical Expression." << endl; 
} 
+2

言うまでもなく、「illogical_expression_exception」は、この診断につながる表現の中の位置と、なぜこれが非論理的であると考えられるかの説明を報告すると仮定します。もちろん、 'catch'節の中で' e.what() 'を呼び出してその診断を出力します。 @MatthieuM。 –

+0

。はい。しかし、私は簡潔にするために言及しなかった(または正直言って、言及するのを忘れていた)。 :) – ApprenticeHacker

関連する問題