当类对象为 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 无法更改它指向的对象的主要内容,如果未能解决你的问题,请参考以下文章

C++ 类设计总结回顾------this指针

使类中的函数指针依赖于初始化值

类的初始化列表的必要性

Python面向对象之运算符重载

几个类的内置方法

寒假学习笔记