2012-03-14 11 views
5

我需要具有公共接口這樣一類Expr的:如何處理傳遞給構造函數的語法有效但邏輯無效的參數?

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

在設計中,如果用戶輸入了一個無效的字符串來構造Expr的對象,如「123 ++ 233 +45分之23」,將最初構造對象並在該對象上調用eval()時通知錯誤是正確的。

或者應該在該點檢查錯誤並引發異常,但這會導致運行時嚴重增加。並且用戶可以在假設對象被創建並且將僅在運行時發現錯誤的情況下編寫代碼。

這樣的問題始終出現在創建類中,是否存在一種相當標準的方式來處理在用戶部分????

+0

直接在構造函數中評估表達式? – ApprenticeHacker 2012-03-14 08:51:15

+1

請參閱[這裏](http://stackoverflow.com/questions/1158410/how-to-handle-incorrect-values-in-a-constructor)。另外,考慮標記你的構造函數'explicit'。 – 2012-03-14 08:51:17

+0

或者寧願使用其他有效的代碼作爲靜態函數僅用於此目的,我的意思是任何一種方式...... – bhuwansahni 2012-03-14 08:52:58

回答

5

關於如何做到這一點的唯一標準部分是詳盡的文檔

我更喜歡儘早拋出錯誤,或者使用工廠的這種類型的對象 - 需要特定參數初始化的對象。如果你使用工廠,你可以返回NULLnullptr或其他。

我沒有看到構建對象時只有在調用eval()時才返回錯誤。重點是什麼?無論如何,這個對象是無效的,爲什麼要等到你使用它?

並引發異常,雖然這會導致運行時嚴重增加 。

你是否對此進行了分析?不要使用異常,因爲您認爲運行時會增加。

+2

「當你必須失敗時,儘快地失敗,並儘快失敗。」 – bkconrad 2012-03-14 08:58:25

+0

我的意思是檢查會導致運行時間增加 – bhuwansahni 2012-03-14 08:59:23

+2

@bhuwansahni:爲什麼?該表達式必須在_some_階段檢查有效性。 – Mankarse 2012-03-14 09:03:21

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()'來打印診斷結果。 – 2012-03-14 09:09:42

+0

@MatthieuM。是。但爲了簡潔,我沒有提及(或者說實話,忘記提及)。 :) – ApprenticeHacker 2012-03-14 10:26:22

相關問題