2013-06-19 65 views
1
I have a class : 

class A 
{ 
    private: 
    vector<int> x; 
    public: 
    const vector<int>& immutable_data() { 
     return x; 
     } 
     vector<int>* mutable_data() { 
      return &x; 
     } 
} 

現在,如果我使用這個類,在我的代碼中,我必須檢查mutable_data()返回的指針是否爲null(假設我知道這個類的結構)。我個人認爲我不需要,因爲我知道存在一個輔助api,它返回一個const引用,所以我的指針永遠不能爲null(我無法想象這個函數會返回null的場景,即使它不知何故返回null,在這種情況下,const ref版本的行爲是什麼)。或者我應該說,我知道它的堆棧上的現有對象的地址,所以它不能爲空?這是對此進行思考或推理的正確方法嗎?如果有人以其他方式思考,請給出一些示例代碼。如果我使用協議緩衝區,我已經知道生成的代碼爲我的消息模板(例如:像stl容器重複的字段),但我仍然需要做null檢查每次我想使用可變的API,因爲他們總是通過指針或const引用返回。通過引用或指針返回並檢查null?

通過引用返回是不是我期待的。

+0

它的代碼,所以這是你的選擇!請記住,如果方法是虛擬的,那麼所有的子類都需要遵守合約,否則你會遇到問題。 – John3136

+1

是否與'常量矢量和數據()const'和'矢量和數據()'有問題嗎? – chris

+0

記住:如果你是'A'的對象是完全構造的,那麼'A :: x'也是完全構造的。 'x'不能成爲'NULL',因爲它不會被存儲在別的地方,並且可以通過指針間接訪問(而不是引用,因爲引用不能成爲NULL)。 –

回答

1

我一定要檢查)由mutable_data(返回的指針爲空或不是(因爲我知道這個類的結構)

一般來說,設計元素,如「有檢查指針「取決於兩件事之一:

  1. 您的設計是否需要證明安全?
  2. 如果不是,那麼A::mutable_data()的設計是否指定它不會返回null

如果(1),那麼你應該投資於那種基於SAT求解器的工具,它可以靜態測試你的代碼不會訪問無效內存。

如果(2),我建議您考慮合同設計的概念 - 它是一個強大的概念。如果A::mutable_data()的界面被指定不返回null,那麼它返回null將是A::mutable_data()中的設計缺陷。

+0

的在最後一段中,如果接口被指定爲不返回一個空指針,然後返回一個空指針將是一個編碼錯誤,而不是設計缺陷。 –

0

返回一個空指針通常意味着「我沒有任何數據你。」如果該類總是有數據,那麼設計上該函數將永遠不會返回空指針。如果是這種情況,那麼使用該函數的代碼不需要檢查空指針。這是該函數的保證之一:「我永遠不會返回空指針」。