2012-01-26 9 views
5

Se alienta el uso de las listas de inicializadores en general. Ahora vamos a decir que tengo el siguiente código (ejemplo trivial sólo para hacer más clara la pregunta):¿Puedo realizar una comprobación de cordura en la lista de inicializadores de un constructor?

class foo 
{ 
    public: 
    foo(ptr1* a, ptr2* b) : m_a(a), m_b(b), m_val(a->val) {} 

    /* code and members here */ 
}; 

me gustaría comprobar que a no es NULL antes de que intenta eliminar la referencia para obtener val. ¿Hay alguna manera de que pueda realizar un control de cordura allí?

Respuesta

5

Use the ternary operator:

#include <cstdio> 

class Test 
{ 
    int x; 

public: 

    Test(int *px) 
    : x (px ? *px : -1) 
    { 
     printf("%d\n", x); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    Test(NULL); 
    return 0; 
} 

Las salidas de muestreo superiores a -1.

+0

Eso es un compromiso bastante bueno. Luego puedo poner los asertos en el cuerpo del constructor y realmente se dispararán correctamente. (+1) – Samaursa

1

que puede probar:

foo(ptr1* a, ptr2* b) : m_a(a), m_b(b), m_val(a==nullptr ? 0 : a->val) {} 

Alternativamente, si a==nullptr es un error en la lógica de programación, puede utilizar una aserción() para atraparlo mientras que la unidad de pruebas de su versiones de depuración.

+0

¡Buenas sugerencias! (+1) – Samaursa

Cuestiones relacionadas