[英]Initialize members in constructor with error
我是C ++的新手,請耐心等待。
當沒有有效值可分配給成員時,是否有最佳實踐初始化成員?
例如:
device_123::device_123(data_struct_t * initData)
{
if(initData==NULL)
{
print_error(0);
// what to initialize foo/bar to?
}
else
{
foo = initData->foo;
bar = initData->bar;
}
}
在“ initData == NULL”的情況下,有一種干凈的方法來初始化foo&bar表示:“嘿,我們實際上沒有得到分配給我們的正確值”。
我知道這個問題聽起來可能與我的代碼實現應如何解釋foo / bar有關,但是我只是想知道是否存在最佳實踐。
如果要確保類構造函數僅使用有效的指針,請更改簽名以使用引用:
class defice_123 {
public:
defice_123(data_struct_t& initData) : foo(initData.foo), boo(initData.boo) {
}
...
};
如上所述,您可以在構造函數中強制執行簽名。
還有其他選擇:
我們在這里說的是最佳實踐,所以我要強硬一些。 總有例外,但是例外是例外,不是最佳實踐。
最佳做法是在獲得初始化對象所需的信息之前,不要分配對象。 這是作為“ 資源分配是初始化”或RAII的一部分捆綁在一起的。
使用RAII,當您構造對象時,它必須完整,有效且可以使用而從構造函數中出來。 如果無法完全正確地初始化對象,則應將其進行垃圾處理,丟棄,清除或以其他方式處置,以免對對象狀態造成任何混淆。 該對象是好的並且可以使用,或者不存在。
如果您沒有足夠的信息來使對象有效,那么您就太早實例化了該對象。 如果在構造對象時輸入的內容導致該對象無效,則您清理並引發異常,然后將對象返回到該對象到達的位置。 創建者沒有得到無效的對象。 曾經
RAII使您不必再使用對象之前就必須檢查諸如object.isvalid()
類的東西。 你有一個對象,這是一個很好的對象。 如果對象包裝了資源,則該資源將在您需要時立即可用。 您無需擔心瑣碎的錯誤,例如打開不存在的文件。 如果有對象,則該文件已打開並可以訪問。
另外,當正確觀察到RAII時,可以保證在對象超出范圍時釋放資源。 靜態分配(通常是堆棧)和智能指針是您的朋友 。
這需要相當成熟的異常使用,你將不會得到一個返回的錯誤代碼,所以拋出的異常需要做出有意義的錯誤的類型或包含一個內容what
字符串,可以有效地處理。 如果性能很關鍵,則在構造之前可能需要捕獲由於例行事件導致的故障,以避免在異常處理程序中浪費時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.