2015-02-17 2 views
0

Я делаю класс, который делится данными между несколькими объектами с использованием динамической памяти. Соответствующие части класса показаны ниже.Сделать shared_ptr в классе неспособным изменить объект, на который указывает объект объекта 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 константную функцию-член, я говорю, что эта функция не изменит DataPtr элемент. Однако базовый вектор, который указывает dataPtr, не является константой, как показано в приведенном ниже коде.

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

Возможно ли или даже желательно сделать базовый вектор const, сделав объект StrBlob const? Должно быть что-то вроде make dataPtr указатель на const, когда объект const, но я не уверен, как этого добиться.

+0

Вам нужно что-то вроде ['propagate_const'] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4372.html). К сожалению, это только предложение прямо сейчас. –

ответ

0

Вы можете сделать тонкую оболочку вокруг 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 или не может контролироваться конструктором классов.