2012-01-26 8 views
5

イニシャライザリストを使用することが一般的に推奨されています。今度は、私は、次のコード(ちょうど質問をより明確にするために簡単な例を)持っているとしましょう:コンストラクタの初期化子リストでサニティチェックを実行できますか?

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

    /* code and members here */ 
}; 

私はそれがvalを得るためにそれを参照解除しようとする前に、aがNULLでないことを確認したいと思います。そこにサニティチェックを行う方法はありますか?

答えて

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

上記のサンプル出力-1

+0

それは十分な妥協点です。コンストラクタ本体にアサートを置くことができ、実際には適切に起動します。 (+1) – Samaursa

1

あなたが試すことができます:a==nullptrはプログラミングロジックに誤りがある場合

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

あるいは、あなたはユニットテストのデバッグビルドしながら、それをキャッチするためのassert()を使用することができます。

+0

良い提案! (+1) – Samaursa

関連する問題