当类对象为常量时,使类中的shared_ptr无法更改它所指向的对象

Making shared_ptr in class unable to change object it points to when class object is const

本文关键字:对象 ptr shared 常量      更新时间:2023-10-16

我正在制作一个类,该类使用动态内存在多个对象之间共享数据。该类的相关部分如下所示。

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所指向的底层向量不是常量,如下面的代码所示。

//The result is foo = {"bar", "foobar"}
const StrBlob foo = {"bar"};
foo.push_back("foobar");

通过使StrBlob对象常量来使基础向量常量是可能的,甚至是可取的吗?当对象为const时,应该将dataPtr设置为指向const的指针,但我不确定如何实现这一点。

您可以围绕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方法修改数据。