哪种方法更好 - 将`const reference`与`boost :: shared_ptr <class>`存储为成员变量</class>

时间:2014-05-07 16:25:35

标签: c++ boost

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;
};

问题&GT;在代码查看期间,我被告知代码(类似于ClassTwo)应该被代码替换(类似于ClassThree),因为将const引用存储到外部类是不安全的。

这是真的吗?

谢谢

2 个答案:

答案 0 :(得分:6)

Const引用和shared_ptr模拟两个相似但不同的概念。

如果你有一个const引用,你就知道&#34;有些东西,你可以检查这个东西(通过const方法),但你不能改变这个东西,更重要的是,这个东西可能随时消失:你不拥有它。

另一方面,shared_ptr为共享所有权建模。您拥有指针指向的对象。你可以改变它,它不会被破坏,除非每个主人都被毁坏。

将const引用返回给私有成员是安全的;接受这样的参考是另一回事。您必须确保参考仍然有效。

shared_ptr更容易处理,但它是一种更昂贵的解决方案。

关于确切的动态,请阅读 manual of shared_ptr

答案 1 :(得分:2)

我认为erenon写得很好。

我想从务实的角度补充一点:

  • const引用成员使类不可复制(事实上,它们可以是可复制的,但是禁止生成默认的特殊成员(析构函数除外)

  • 另一方面,
  • shared_ptr使内容本身可复制(使用浅克隆语义)。事实证明,在状态将被保留/传递的仿函数中非常有用。 Boost Asio是一个很好的例子,因为执行的逻辑线程在线程之间蜿蜒而且生命周期很难实现。

  • 我建议使用shared_ptr<const T>;这会在共享的上下文中添加 immutability 。您将需要克隆指向的对象以使用更改的版本替换它,并且不会通过shared_ptr<const T>

  • 修改共享对象