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