2012-01-26 16 views
5

Korzystanie z list inicjalizujących jest ogólnie zalecane. Teraz załóżmy, że mam następujący kod (trywialny przykład tylko, aby kwestia jaśniejsze):Czy mogę wykonać sprawdzanie poprawności na liście inicjalizacyjnej konstruktora?

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

    /* code and members here */ 
}; 

Chciałbym sprawdzić, czy nie jest NULL a zanim spróbuje dereference to dostać val. Czy jest jakiś sposób, abym mógł przeprowadzić tam test poczytalności?

Odpowiedz

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

Powyższe przykładowe -1 wyjścia.

+0

To wystarczająco dobry kompromis. Mogę wtedy umieścić twierdzenia w ciele konstruktora, a oni faktycznie będą strzelać poprawnie. (+1) – Samaursa

1

Można spróbować:

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

Ewentualnie, jeśli a==nullptr jest błąd w logice programowania można używać assert(), aby go złapać, gdy jednostka-testowania debug buduje.

+0

Dobre sugestie! (+1) – Samaursa

Powiązane problemy