最近我想到,我經常想承認的一個「偶爾出現的奇怪的bug」的修正是簡單地初始化一個成員變量我忘了添加到初始化列表中。包裝內置的C++類型以保證初始化
爲了避免將來在這類錯誤上浪費時間,我一直在嘗試着完全拋棄內置的原始類型,並用包裝類代替它們,它們的行爲與原始類型完全相同,只是它們會總是被初始化。
我在C++中足夠精通,知道我可以編寫非常接近該目標的類。即我相信我可以寫一個MyInt類,它的行爲非常像一個真正的int。但是我也知道C++已經足夠了,知道可能有一兩件事情會遺漏;)
有沒有人做過類似這樣的事情?任何指向相關文檔的指針,或要注意的陷阱列表?這是一個好主意,還是我沒有看到任何缺點?
謝謝!
編輯:謝謝大家對您的意見,這裏是一個更新。我開始玩Jarod42的包裝片段,看看我是否可以轉換一個小型的業餘愛好項目代碼庫。不是完全意外的,這是一個PITA,但可能是可行的。儘管如此,它開始感覺像是一個非常大的錘子。
編譯器警告不是一個真正的選擇,因爲只有一個(-WeffC++)似乎發現問題,它只存在於gcc中,即這不是一個安全的便攜式解決方案。
到目前爲止,我的結論是開始使用C++ 11的所有原始成員的類初始化,如下面的Praetorian所建議的。即像
struct C {
int x = 0; // yay C++11!
};
..並希望經過一段時間後,ommitting例如初始化的感覺那麼「裸」作爲一個函數內聲明的代碼unititialized變量(我已經不再做以前很長一段時間)。這似乎比嘗試將初始化程序列表更新爲最新更容易出錯,因爲它正好與聲明一起。
這聽起來像你不想使用C++ ... – BoBTFish
爲什麼不使用像cppcheck這樣的靜態代碼檢查器,它會發現這個問題和其他許多問題? –
主要的缺點是性能。大多數編譯器都會在寄存器中返回一個「int」,但不會返回寄存器中的類類型,不管它有多簡單。但是,如果你限制你的包裝類型類成員... –