当类对象为常量时,使类中的shared_ptr无法更改它所指向的对象
Making shared_ptr in class unable to change object it points to when class object is const
我正在制作一个类,该类使用动态内存在多个对象之间共享数据。该类的相关部分如下所示。
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方法修改数据。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 唯一 ptr 将所有权移动到包含对象的方法
- 如何传递容器、ptr 和对象不可修改的unique_ptrs容器?
- 在C++中,对象什么时候真正被销毁?delete(ptr)做什么
- 使针对特定托管对象的所有共享 ptr 失效
- ptr<Node> a = 创建对象 < 节点 > ();
- 一个唯一的ptr类如何将它的实例指针传递给它的成员对象
- 从基类ptr的vector对象中擦除
- openv Ptr类.指针对象在调用函数后被删除
- 共享 PTR - C++ 如何使用引用计数管理对象缓存
- 当可以在类对象超出范围之前删除此数据时,类允许访问其数据(通过 ptr/it)是否设计不好
- c++类的析构函数包含ptr到对象的数组
- 如何使用c++ Mat类ptr对象的基本C包装器打印Mat元素?
- 共享Ptr与普通Ptr:声明后的对象创建