当类对象为 const 时,使类中的 shared_ptr 无法更改它指向的对象
Posted
技术标签:
【中文标题】当类对象为 const 时,使类中的 shared_ptr 无法更改它指向的对象【英文标题】:Making shared_ptr in class unable to change object it points to when class object is const 【发布时间】:2015-02-17 17:21:32 【问题描述】:我正在创建一个使用动态内存在多个对象之间共享数据的类。该类的相关部分如下所示。
class StrBlob
public:
StrBlob::StrBlob(std::initializer_list<std::string> il) :
data(std::make_shared<std::vector<std::string>>(il))
void push_back(const std::string &t) const data->push_back(t);
private:
std::shared_ptr<std::vector<std::string>> dataPtr;
;
我理解通过使 push_back 成为一个 const 成员函数,我是说这个函数不会改变成员 dataPtr。但是,dataPtr 指向的底层向量不是 const,如下代码所示。
//The result is foo = "bar", "foobar"
const StrBlob foo = "bar";
foo.push_back("foobar");
是否可以通过使 StrBlob 对象为 const 来使底层向量为 const?当对象为 const 时,应该类似于使 dataPtr 成为指向 const 的指针,但我不确定如何实现。
【问题讨论】:
你需要像propagate_const
这样的东西。不幸的是,这只是一个提议。
【参考方案1】:
您可以在 std::shared_ptr
周围制作一个薄包装(省略 ctor 等细节):
#include <memory>
template< class T > class const_propagated_shared_ptr
std::shared_ptr<T> m_ptr;
public:
T &operator*() return m_ptr.operator*();
T* operator->() return m_ptr.operator->();
const T &operator*() const return m_ptr.operator*();
const T *operator->() const return m_ptr.operator->();
;
class Foobar
const_propagated_shared_ptr<int> m_ptr;
public:
void f1() *m_ptr = 10;
void f2() const *m_ptr = 10; // compile error
;
但由于这是类的实现细节(在这种情况下为 Foobar),我不确定它是否会更糟糕,因为是否可以通过 const 方法修改数据可以由类设计器控制。
【讨论】:
以上是关于当类对象为 const 时,使类中的 shared_ptr 无法更改它指向的对象的主要内容,如果未能解决你的问题,请参考以下文章