2012-01-26 21 views
5

一般鼓勵使用初始值設定項列表。現在讓我們假設我有以下代碼(簡單的例子,只是爲了使問題更清晰):我可以在構造函數的初始化程序列表中執行完整性檢查嗎?

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

    /* code and members here */ 
}; 

我想檢查a不是NULL它試圖取消引用它得到val之前。有什麼方法可以在那裏進行健康檢查?

回答

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

你可以試試:

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

或者,如果a==nullptr是編程邏輯錯誤,你可以使用一個assert(),而單元測試你的調試版本抓住它。

+0

好的建議! (+1) – Samaursa

相關問題