簡體   English   中英

如何從非空函數返回?

[英]How to return from a non-void function?

我在下面有一個函數搜索my_type的向量。 目前,它有一個編譯警告: control reaches end of non-void function [-Wreturn-type] 看來,只要我使用引用作為我的返回類型而不是指針,就不可能返回類似null的值?

struct my_type{
    type_a a;
    type_b b;
}

    type_b& value(type_a& t){
        typename std::vector<my_type>::iterator it;  
        for(it = v.begin(); it != v.end(); ++it){
            if ((*it).a == t) return (*it).b;
            }
    }

看來,只要我使用引用作為我的返回類型而不是指針,就不可能返回類似null的值?

嗯,是的,但這不是唯一的問題。 引用永遠不能為null ,但是如果你的if語句永遠不會計算為true會發生什么? 你不返回任何東西

由於引用不能為null,因此返回null 您必須從所有執行路徑返回有效的引用。

此外,您的代碼充其量也是脆弱的。 您將返回對容器中元素成員的引用...可能在將來的任何位置移動的元素,使該引用無效。

你需要考慮的問題是,當你的函數必須返回my_type時,如果找到“nothing”,你應該返回my_type 如何處理這直接影響調用者如何使用此函數和假設。

您可以考慮一些想法。 例如,如果您的value函數返回指針類型,您可以只返回NULL以指示任何內容。 如果它返回一個字符串,你可以使用空字符串""或甚至像"none"這樣的特殊字符串值來表示。 對於type_b您可以創建它的特殊實例,只返回該實例以指示任何內容。 調用此函數的其他函數將檢查返回的type_b以查看該實例是否為type_b 關鍵是,有很多方法可以解決它,你選擇哪種方式取決於你。

但更好的方法是使用stl已經提供的東西 - 特別是std::find_if 例如,您可以創建一個指定何時匹配的仿函數:

struct find_b
{
  const type_a &this_a;
  find_b(const type_a &a) : this_a(a) {}
  bool operator() (const my_type &lhs)
  {
    return lhs.a == this_a;
  }
};

然后你會像這樣使用它:

item = std::find_if(v.begin(), v.end(), find_b(t));
if(item == v.end()) { /* not found */ }
else { /* found, do something useful here */ }

暫無
暫無

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

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