[英]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.