2011-12-19 79 views
1

給定的是一個C++類,它包含內部數據,該數據必須暴露在外部並且也應該是可修改的。獲取和設置內部數據:返回類型,出錯時的行爲

class Container { 
    public: 
    ... get(int key) const; 
    ... set(int key, int value); 
    private: 
    std::vector<int> m_values; 
}; 

的問題是什麼返回類型get()set()最好得到。對於get()

  1. const int& get(key),引用const值。
  2. const int* get(key),指向const值的指針。

當使用該引用時,當給定的鍵不存在於容器中時,必須發生。例外?或只是訪問m_values,讓它拋出?依靠assert s?

指針返回類型可以返回nullptr,指示無效操作。但是,這是不是意味着調用者通常會請求不在那裏的東西而做錯了一些事情?

對於set()

  1. void set(key, value)
  2. bool set(key, value)

void版本忽略無效鍵或值。再次說明:如果發生錯誤,該怎麼辦?

bool版本在成功時返回true,當密鑰和/或值無效時返回false。此處與get()相同:用戶在指定無效密鑰和/或值時可能做了錯誤處理。

您寧願讓應用程序崩潰以指示用戶使用它錯誤還是依賴用戶檢查結果返回值?

+0

考慮到std :: vector已經有一個簡單的'get&set',它不會執行很多錯誤檢查..我會在你的Container中處理一些' – 2011-12-19 00:38:39

+0

@parapurarajkumar'std :: vector'當然是唯一的一個例子,它並沒有像你說的那樣做很多的錯誤檢查,所以你(作爲用戶)必須檢查你對它的處理是否正確。這可能就是我在這裏問的問題。 – stschindler 2011-12-19 00:50:52

+2

如果'key'不好,你是否考慮過拋出'std :: invalid_argument'? – moshbear 2011-12-19 00:52:28

回答

1

對於吸氣劑,我也會考慮按價值返回。返回一個指針(yuk)或一個引用限制選項以在稍後的日期重新實現您的類的內部,除非您也樂意進行接口更改。

作爲一個人爲的例子,可以考慮:

class Person 
{ 
public: 
    // Returns height in metres 
    const int &getHeight() const { return height; } 

private: 
    int height; // Height in metres 
}; 

現在在以後的日子,如果我們決定要改變什麼的內部存儲以毫米爲單位的高度?我們不能做到這一點:

const int &getHeight() const { return height/1000; } 

至於二傳手,嗯,這是真的你來決定如何對失敗做。

+0

只要您不想*將對象的引用*存儲到對象,就可以按值返回。在我用'int's的例子中,它很好,但是'Container'可能包含其他地方被引用的對象。 – stschindler 2011-12-19 00:49:00

+0

@Tank:確實;我並不是說按價值就是*最佳*選擇,只是您應該將其視爲一種選擇。 – 2011-12-19 00:50:00