2017-02-05 66 views
0

請參閱以下sudo代碼。我可以在C++中返回一個選定的參考嗎?

Object& getObjectDependingOnMonth(std::string& month, std::vector<Object>& vec) { 

    if (month == "January") { 
     auto& ref = vec.at(1); 
    } else { 
     auto& ref = vec.at(2); 
    } 

    ref.do_something(); // error because ref is local in block above. 

    return ref; // error because ref is local in block above. 
} 

上面的代碼顯示了我想要做的事情。我想獲得一個向量元素的參考。這取決於一個月的輸入。我想在函數getObjectDependingOnMonth(...)之外使用它的引用。然而,我想不出如何在矢量中返回一個選定元素的有效引用,而無需在塊中重複代碼。 auto & ref = ...在if塊中定義。裁判在裁判區外無效。

我可以從函數返回一個選定的參考嗎? 非常感謝。

+0

這是否編譯爲'ref'超出範圍 –

+0

@BeyelerStudios:我爲我的錯誤道歉。我改變std :: vector - > std :: vector 並且不使用時間向量。 – mora

回答

5

只需更改代碼:

if (month == "January") { 
    auto& ref = vec.at(1); 
} else { 
    auto& ref = vec.at(2); 
} 

以下,讓你有一個參考

auto& ref = vec.at(month == "January" ? 1 : 2); 
+0

感謝您告訴我一個解決方案。感謝您的解決方案,我知道將元素選擇和賦值分配給參考非常重要。非常感謝你。 – mora

1

是的!

Object& getObjectDependingOnMonth(std::string& month, std::vector<Object>& vec) { 

    if (month == "January") { 
     vec.at(1).do_something(); 
     return vec.at(1); 
    } else { 
     vec.at(2).do_something(); 
     return vec.at(2); 
    } 

}

+0

謝謝你告訴我答案。請讓我更多地問你。我的代碼在vec.at()之後有很多代碼。您的解決方案需要在每個塊中重複大量的代碼。我可以避免它嗎? – mora

+0

也許我應該把所有代碼放在do_something()中以避免重複的代碼。謝謝。 – mora

+0

也許閱讀[DRY](https://en.wikipedia.org/wiki/Don't_repeat_yourself) –

0

當你想(重新)分配的參考,只需使用指針而不是參考。在退貨時將其解除引用。

2

在C++中它是非常地道的使用說明在容器中的位置迭代器:

auto getObjectDependingOnMonth(const std::string& month, std::vector<Object>& vec) { 
    decltype(vec.begin()) pos; 

    if (month == "January") 
     pos = vec.size() > 1 ? vec.begin() + 1 : vec.end(); 
    else 
     pos = vec.size() > 2 ? vec.begin() + 2 : vec.end(); 

    if(pos != vec.end()) 
     pos->do_something(); 

    return pos; 
} 
+0

怎麼樣,'auto pos = std :: begin(vet);'然後'pos = std :: advance(pos,i);'不需要decltype或者條件運算符 – dlavila

+0

@dlavila你也可以做到這一點,只是不要忘記不要過去'結束'... – BeyelerStudios

+0

@BeyelerStudios:謝謝你告訴我另一種解決方案。 – mora