我需要创建一个具有公共接口的类Expr:
class Expr{
//...
public:
Expr(const char*);
int eval(); //Evaluates the expression and gives the result
void print();
};
在设计中,如果用户输入无效字符串来构造Expr对象,如“123 ++ 233 + 23/45”,那么最初构造Object并在调用eval()时通知错误是否正确那个对象。
或者应该在该点检查错误并抛出异常,但这会导致运行时严重增加。并且用户可以编写代码,并假设创建了Object,并且仅在运行时发现错误。
这些问题总是在创建一个类时出现,是否有一种相当标准的方法来处理用户所造成的错误????
答案 0 :(得分:5)
关于如何执行此操作的唯一标准部分是详尽的文档。
我更喜欢尽早抛出错误,或者使用工厂来处理这种类型的对象 - 需要初始化特定参数的对象。如果您使用工厂,则可以返回NULL
或nullptr
或其他任何内容。
我没有看到构造对象的意义,只有在调用eval()
时才会返回错误。重点是什么?无论如何,该对象无效,为什么要等到你使用它?
并抛出异常,但这会导致严重的增加 在运行时。
你有没有想过这个?不要因为假设运行时间增加而使用异常。
答案 1 :(得分: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;
}