2014-04-22 59 views
0

我的方法可以返回某種指針(例如boost :: shared_ptr),並且此指針可能爲NULL。是否有任何方法來強制我的代碼的用戶檢查,如果它是空的或不是?在C++中強制NULL檢查

這樣的事情的一些例子 - scals的Option容器,可能是boost有boost :: option之類的東西嗎?

+0

爲什麼你希望用戶在返回你的shared_ptr之前檢查而不是檢查發佈條件? – evpo

+1

你不能強制檢查'NULL'的返回類型。大多數編譯器提供的是未使用函數結果的警告。可能有一個例外更合適? – Deduplicator

+0

「強制我的代碼的用戶檢查」 - 並做什麼如果檢查失敗? –

回答

2

你可以做到以下幾點:

  • 回報,如果訪問並設置爲NULL拋出異常的智能指針類型。
  • 拋出一個異常,而不是返回NULL指針
  • 返回一個std ::可選的(或推動::可選)表達意圖(即「值可能會丟失」)不是一個指針
+1

'boost :: optional'如何比指針更好? –

+0

前兩種解決方案並沒有真正解決這個問題。據推測,有些情況下函數應該返回一個空指針;客戶必須進行測試,並在這種情況下采取不同的行爲。可以用異常來做到這一點,但是如果檢查應該立即發生在調用函數中,則會使事情變得特別難以處理。 –

1
好得多

這裏的現實是你的函數的調用者必須檢查。如果他們試圖訪問共享指針而不檢查,那麼如果基礎指針爲NULL,則會發生seg-fault。

您不指定是否在編寫庫或項目中的某些代碼。你也沒有具體說明這個代碼的上下文的細節 - 所有這些都可能決定我在這種情況下采取哪種方法 - 但總的來說,utnapistim的所有建議都是好的。

2

通常的解決方案是在一個類來包住返回值,這 包含如果指針被選中或 複製,並且其析構函數崩潰,如果沒有設置標誌,該標誌被設置的標誌。 喜歡的東西:

template <typename T> 
class MustBeChecked 
{ 
    T* myValue; 
    mutable bool myHasBeenChecked; 
public: 
    MustBeChecked(T* value) 
     : myValue(value) 
     , myHasBeenChecked(false) 
    { 
    } 
    MustBeChecked(MustBeChecked const& other) 
     : myValue(other.myValue) 
     , myHasBeenChecked(false) 
    { 
     other.myHasBeenChecked = true; 
    } 
    ~MustBeChecked() 
    { 
     assert(myHasBeenChecked); 
    } 

    bool operator==(nullptr_t) const 
    { 
     myHasBeenChecked = true; 
     return myValue == nullptr; 
    } 

    bool operator!=(nullptr_t) const 
    { 
     myHasBeenChecked = true; 
     return myValue != nullptr; 
    } 

    operator T*() const 
    { 
     assert(myHasBeenChecked); 
     return myValue; 
    } 
}; 

坦率地說,我覺得這是矯枉過正在大多數情況下。但我已經看到它在一些關鍵系統上使用了 。