簡體   English   中英

用錯誤初始化構造函數中的成員

[英]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) {
  }
...
};

如上所述,您可以在構造函數中強制執行簽名。

還有其他選擇:

  1. 當構造函數出了問題時,拋出異常
  2. 在構造函數中做最少的事情(零變量),並將復雜的東西移到初始化函數,您可以靈活地在失敗時返回更多細節。

我們在這里說的是最佳實踐,所以我要強硬一些。 總有例外,但是例外是例外,不是最佳實踐。

最佳做法是在獲得初始化對象所需的信息之前,不要分配對象。 這是作為“ 資源分配是初始化”或RAII的一部分捆綁在一起的。

使用RAII,當您構造對象時,它必須完整,有效且可以使用而從構造函數中出來。 如果無法完全正確地初始化對象,則應將其進行垃圾處理,丟棄,清除或以其他方式處置,以免對對象狀態造成任何混淆。 該對象是好的並且可以使用,或者不存在。

如果您沒有足夠的信息來使對象有效,那么您就太早實例化了該對象。 如果在構造對象時輸入的內容導致該對象無效,則您清理並引發異常,然后將對象返回到該對象到達的位置。 創建者沒有得到無效的對象。 曾經

RAII使您不必再使用對象之前就必須檢查諸如object.isvalid()類的東西。 你有一個對象,這是一個很好的對象。 如果對象包裝了資源,則該資源將在您需要時立即可用。 您無需擔心瑣碎的錯誤,例如打開不存在的文件。 如果有對象,則該文件已打開並可以訪問。

另外,當正確觀察到RAII時,可以保證在對象超出范圍時釋放資源。 靜態分配(通常是堆棧)和智能指針是您的朋友

這需要相當成熟的異常使用,你將不會得到一個返回的錯誤代碼,所以拋出的異常需要做出有意義的錯誤的類型或包含一個內容what字符串,可以有效地處理。 如果性能很關鍵,則在構造之前可能需要捕獲由於例行事件導致的故障,以避免在異常處理程序中浪費時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM