2014-01-22 135 views
2

當函數返回的INT返回錯誤返回參考

int&  MyClass::getElement(int position) 
{ 
    if (position < _size) 
     return (_array[position]); 
    return ([...]) // An Error 
} 

參考我首先想到的是返回NULL。 但顯然一個引用不能爲NULL。

在這種情況下返回錯誤的正確方法是什麼?

+3

不涉及幻數的唯一方法是引發異常。 – juanchopanza

+1

我同意當前的答案,但我想補充一點:一個例外是當你的功能不能堅持自己的接口。在這種情況下,接口承諾「如果你給我一個'int',我會給你另一個'int'回來。由於錯誤情況違反了該合同,這是一種特殊情況。 –

+1

您還應該檢查否定索引,或使用無符號類型。 –

回答

3

各種選擇,大致與我的優選選項排序第一:

  • 拋出異常,以往std::out_of_range
  • 返回指針
  • 返回一些其它類型的具有良好定義無效值,如std::pair<bool,int&>boost::optional<int&>。如果你想通過值返回某些東西,而不是引用,那麼這會更有用,所以不能返回指針。
  • 如果您可以選擇永遠不會成爲有效數據的數字,則返回對靜態幻數的引用。這是令人討厭的,因爲沒有什麼可以阻止調用者修改它。
0

如果您需要返回引用,則必須在發生錯誤時引發異常。

0

另一件需要考慮的事情是,即使你返回了一個'​​int'(即不是一個引用),NULL也會是0(所以很容易與一個有效的'0'值相混淆)。

如果你想堅持這個函數定義,那麼拋出一個異常來指示一個錯誤。

int&  MyClass::getElement(int position) 
{ 
    if (position < _size) 
     return (_array[position]); 

    throw std::out_of_range("Invalid size to getElement"); 
} 
+0

'range_error'比'invalid_argument'更傳統。 –

+1

(我的意思是'out_of_range',抱歉)。 –

1

正確的方法是在參數位置沒有可接受的值的情況下拋出std::out_of_range類型的異常。