[英]Is there a better/safe way to cast non-const reference of shared_ptr to a base class?
[英]Which is a better way - store `const reference` vs `boost::shared_ptr<Class>` as a member variable
class ClassOne : boost::noncopyable
{
};
class ClassTwo : boost::noncopyable
{
public:
ClassTwo(const ClassOne& one)
: m_one ( one ) {}
private:
const ClassOne& m_one;
};
class ClassThree : private boost::noncopyable
{
public:
ClassThree(boost::shared_ptr<const ClassOne> one)
: m_one ( one ) {}
private:
boost::shared_ptr<const ClassOne> m_one;
};
class ClassFour : private boost::noncopyable
{
public:
ClassFour(const boost::shared_ptr<const ClassOne>& one)
: m_one ( one ) {}
private:
boost::shared_ptr<const ClassOne> m_one;
};
問題>在代碼查看期間,我被告知代碼(類似於ClassTwo
)應該被代碼替換(類似於ClassThree
),因為將const引用存儲到外部類是不安全的。
真的嗎?
謝謝
Const引用和shared_ptr
模型有兩個相似但不同的概念。
如果你有一個const引用,你“知道”某些東西,你可以檢查這個東西(通過const方法),但你不能改變這個東西,更重要的是,這個東西可能隨時消失:你不擁有它。
另一方面, shared_ptr
為共享所有權建模。 您擁有指針指向的對象。 你可以改變它,它不會被破壞,除非每個主人都被毀壞。
將const引用返回給私有成員是安全的; 接受這樣的參考是另一回事。 您必須確保引用仍然有效。
shared_ptr
更容易處理,但它是一個更昂貴的解決方案。
關於確切的動態,請閱讀shared_ptr
的手冊
我認為erenon寫得很好。
我想從務實的角度補充一點:
const引用成員使類不可復制(事實上,它們可以是可復制的,但是禁止生成默認的特殊成員(析構函數除外)
另一方面,shared_ptr使內容本身可復制(使用淺克隆語義)。 事實證明,在狀態將被保留/傳遞的仿函數中非常有用。 Boost Asio是一個很好的例子,因為執行的邏輯線程在線程之間蜿蜒而且生命周期在很大程度上是不可預測的。
我建議使用shared_ptr<const T>
; 這增加了共享背景下的不變性 。 您將需要克隆指向的對象以使用更改的版本替換它,並且不會通過shared_ptr<const T>
修改共享對象
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.