2012-03-14 12 views
5

tengo que hacer una clase Expr tener interfaz pública como esto:¿Cómo se maneja un argumento sintácticamente válido pero lógicamente inválido pasado al constructor?

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

En el diseño, si el usuario introduce una cadena no válida para construir un objeto Expr como "123 ++ 233 + 23/45", lo haría es correcto construir el Objeto inicialmente y notificar el error cuando eval() se llama a ese objeto.

O el error se debe comprobar en ese punto y se lanzará una excepción, aunque eso llevaría a un serio aumento en el tiempo de ejecución. Y el usuario puede escribir el código furthur con la suposición de que se creó Object y descubrirá el error en tiempo de ejecución solamente.

Tales problemas surgen siempre al crear una clase, ¿existe una forma bastante estándar de manejar dichos errores realizados por el usuario? ????

+0

evaluar la expresión directamente en el constructor? – ApprenticeHacker

+1

Ver [aquí] (http://stackoverflow.com/questions/1158410/how-to-handle-incorrect-values-in-a-constructor). Además, considere marcar su constructor 'explicit'. –

+0

O más bien usando algún otro código eficiente como función estática solo para ese propósito, me refiero a cualquiera de las dos formas ... – bhuwansahni

Respuesta

5

La única parte estándar acerca de cómo hacer esto es documentación completa.

Prefiero arrojar los errores lo antes posible, o utilizar una fábrica para objetos de este tipo - objetos que requieren argumentos específicos para ser inicializados. Si usa una fábrica, puede devolver un NULL o un nullptr o lo que sea.

No veo el sentido de construir el objeto y devolver un error solo cuando se llama a eval(). ¿Cuál es el punto de? El objeto no es válido de todos modos, ¿por qué esperar hasta que lo use?

y se lanzará una excepción, aunque eso llevaría a un serio aumento de en tiempo de ejecución.

¿Le hiciste un perfil al? No use excepciones porque asume un aumento en el tiempo de ejecución.

+2

"Cuando deba fallar, falle ruidosamente y lo antes posible". – bkconrad

+0

Me refiero a la comprobación conduciría a un aumento en el tiempo de ejecución – bhuwansahni

+2

@bhuwansahni: ¿Por qué? La expresión debe verificarse para verificar su validez en _some_ stage. – 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

Por supuesto, uno supondría que la 'illogical_expression_exception' informa la posición en la expresión que conduce a este diagnóstico, así como una explicación de por qué esto se considera ilógico. Y uno por supuesto llamaría 'e.what()' dentro de la cláusula 'catch' para imprimir ese diagnóstico. –

+0

@MatthieuM. sí. Pero no mencioné (o para ser honesto, olvidé mencionar) eso por brevedad. :) – ApprenticeHacker

Cuestiones relacionadas