2012-03-14 33 views
5

tôi cần phải thực hiện một lớp expr có giao diện công cộng như thế này:Làm thế nào để xử lý một đối số cú pháp hợp lệ nhưng hợp lệ không hợp lệ được truyền cho hàm tạo?

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

Trong thiết kế, nếu người dùng nhập vào một chuỗi không hợp lệ để xây dựng một đối tượng expr như "123 ++ 233 + 23/45", sẽ nó được quyền xây dựng đối tượng ban đầu và thông báo lỗi khi eval() được gọi trên đối tượng đó.

Hoặc lỗi phải được kiểm tra tại điểm đó và bị loại trừ, mặc dù điều đó sẽ dẫn đến sự gia tăng nghiêm trọng về thời gian chạy. Và người dùng có thể viết mã furthur với giả định rằng đối tượng được tạo ra và sẽ phát hiện ra lỗi khi chạy chỉ ..

Các vấn đề như vậy nảy sinh trong việc tạo ra một lớp, có một cách khá chuẩn để xử lý các lỗi đó được thực hiện ở phần của người dùng ????

+0

đánh giá biểu thức trực tiếp trong hàm tạo? – ApprenticeHacker

+1

Xem [tại đây] (http://stackoverflow.com/questions/1158410/how-to-handle-incorrect-values-in-a-constructor). Ngoài ra, hãy xem xét đánh dấu hàm tạo của bạn 'tường minh'. –

+0

Hoặc thay vì sử dụng một số mã hiệu quả khác như một chức năng tĩnh cho mục đích đó, tôi có nghĩa là một trong hai cách ... – bhuwansahni

Trả lời

5

Phần tiêu chuẩn duy nhất về cách bạn thực hiện điều này là tài liệu kỹ lưỡng.

Tôi thích ném các lỗi càng sớm càng tốt, hoặc sử dụng một nhà máy cho các đối tượng thuộc loại này - các đối tượng yêu cầu đối số cụ thể được khởi tạo. Nếu bạn sử dụng một nhà máy, bạn có thể trả lại NULL hoặc nullptr hoặc bất kỳ thứ gì.

Tôi không thấy điểm trong việc xây dựng đối tượng và chỉ trả về lỗi khi eval() được gọi. Vấn đề ở đây là gì? Các đối tượng là không hợp lệ anyway, tại sao chờ đợi cho đến khi bạn sử dụng nó?

và ngoại lệ được ném, mặc dù điều đó sẽ dẫn đến tăng nghiêm trọng trong thời gian chạy.

Bạn đã lược tả điều này chưa? Không sử dụng ngoại lệ vì bạn giả định tăng thời gian chạy.

+2

"Khi bạn phải thất bại, không ồn ào và càng sớm càng tốt." – bkconrad

+0

Tôi có nghĩa là kiểm tra sẽ dẫn đến tăng thời gian chạy – bhuwansahni

+2

@ bhuwansahni: Tại sao? Biểu thức phải được kiểm tra tính hợp lệ ở giai đoạn _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

Tất nhiên, người ta sẽ giả định rằng 'illogical_expression_exception' báo cáo vị trí trong biểu thức dẫn đến chẩn đoán này cũng như giải thích tại sao điều này được coi là vô lý. Và tất nhiên, người ta sẽ gọi 'e.what()' trong mệnh đề 'catch' để in chẩn đoán đó. –

+0

@MatthieuM. Vâng. Nhưng tôi đã không đề cập đến (hoặc phải trung thực, quên đề cập) mà cho ngắn gọn. :) – ApprenticeHacker

Các vấn đề liên quan