我問了相關問題here。現在它有點微妙了。如何確保返回向量的常量<unique_ptr>
下面是代碼:
class MyClass {
public:
const vector<unique_ptr<MyObject> >& get_const_objs() const;
private:
vector<unique_ptr<MyObject>> m_objs;
};
我的本意是,從get_const_objs返回向量()是隻讀的,但問題是,因爲向量的元素不是const的,所以調用者仍然可以改變個別元素,例如
const vector<unique_ptr<MyObject>>& objs = pMyClass->get_const_objs();
unique_ptr<MyObject> p = move(objs[0]);
我的解決辦法是插入一個const,以矢量:
const vector<const unique_ptr<MyObject> >& get_const_objs() const;
但是這會導致一個無聊的實施get_const_objs(),我的每個元素複製到新的載體:
const vector<const unique_ptr<MyObjects>>& MyClass::get_const_objs() const
{
vector<const unique_ptr<MyObjects>> ret;
for (const auto &obj : my_objs) {
ret.push_back(obj);
}
return ret;
}
是的,我可以添加迭代器接口到MyClass。還有其他解決方案嗎?
我有一個限制:BOOST不可用。但是我喜歡知道BOOST解決方案,如果真的有很好的標準使用。
使用'const T'作爲向量中的類型違反了它的要求。而'unique_ptr p = move(objs [0]);'不編譯。 –
chris
2014-08-29 04:21:50
如果我正確理解你的問題,你正試圖找到一種方法來防止改變'vector'所持有的對象。如果是這樣,你的標題有點誤導。 – 2014-08-29 04:42:04
您已經無法通過對該向量的常量引用修改向量內的元素。你在談論如何防止修改指針指向的'MyObject'? – 2014-08-29 06:17:44