`shared_ptr` нарушает константность объекта - PullRequest
5 голосов
/ 22 июня 2011

Рассмотрим следующий код:

class B 
{
    int x;
public:
    B() : x( 10 ) {}
    int get_x() const { return x; }
    void set_x( int value ) { x = value; }
};

class A
{
    boost::shared_ptr<B> b_;
public:
    boost::shared_ptr<B> get_b() const { return b_; } // (1)
};

void f( const A& a)
{
    boost::shared_ptr<B> b = a.get_b();
    int x = b->get_x();
    b->set_x( ++x ); // (2)
}

int main()
{
    A a;
    f( a );

    return 0;
}

В этом коде (2) независимо без каких-либо ошибок или предупреждений компилируется тот факт, что get_b является константной функцией, а a является константным объектом.

Мой вопрос: как вы справляетесь с этой ситуацией?Лучшее, что я могу использовать, это изменить (1) на следующее:

boost::shared_ptr<const B> get_b() const { return b_; } // (1)

Но я всегда должен помнить, что я должен добавить const к типу возвращаемого значения.Это не очень удобно.Есть ли лучший способ?

1 Ответ

13 голосов
/ 22 июня 2011

На самом деле это не имеет ничего общего с общими указателями. Я имею в виду, если бы у вас был простой указатель, у вас была бы точно такая же проблема, и вы бы решили ее точно так же, то есть

const B* get_b() const {return b_; }

Если вы оставили это как

B* get_b() const {return b_; }

у тебя будет такая же проблема.

Ну, вы сами нашли решение.

boost::shared_ptr<const B> get_b() const { return b_; } // (1)

Это единственный правильный способ сделать это.

...