2012-01-26 7 views
5

L'utilizzo degli elenchi di inizializzatori è generalmente consigliato. Ora diciamo che ho il seguente codice (esempio banale solo per fare la domanda più chiaro):È possibile eseguire il controllo di integrità nell'elenco di inizializzazione di un costruttore?

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

    /* code and members here */ 
}; 

vorrei controllare che a non è NULL prima che si tenta di risolvere il riferimento esso per ottenere val. C'è un modo per eseguire un controllo di sanità mentale?

risposta

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; 
} 

Le uscite campionamento superiori -1.

+0

Questo è un buon compromesso. Posso quindi inserire gli asserzioni nel corpo del costruttore e in effetti si attivano correttamente. (+1) – Samaursa

1

si può provare:

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

In alternativa, se a==nullptr è un errore nella logica di programmazione, è possibile utilizzare un assert() per catturare mentre unit test del build di debug.

+0

Buoni suggerimenti! (+1) – Samaursa

Problemi correlati