Использование boost :: make_shared с наследованием

Рассмотрим два класса

class A{
public:
int i;
A(){}
explicit A(const int ii):i(ii){}
virtual ~A(){
cout<<"~A - "<< i <<endl;
}
virtual void inc(){
i++;
cout<<"i: "<<i<<endl;
}
};

class B: public A{
public:
int j;
B(){}
explicit B(const int jj, const int ii=-1):A(ii), j(jj){}
~B(){
cout<<"~B - "<<i<<", "<<j<<endl;
}
void inc(){
A::inc();
j++;
cout<<"j: "<<j<<endl;
}
};

Теперь мы можем сделать это в main():

A *pa = new B();
//...
pa->inc(); // implements B::inc();

Теперь версия использует boost библиотека

boost::shared_ptr<A> pa = boost::make_shared<B>(2);
//...
pa->inc(); // implements B::inc();

Мой вопрос, в использовании boost версия, является ли это приемлемым для использования таким образом, то есть обе версии могут использоваться одинаково, или мне нужно сделать что-то дополнительное (я не знаю много внутренних деталей boost)

0

Решение

Есть несколько вещей, которые вы не можете сделать с помощью умных указателей:

  • Вы не можете передать умный указатель в качестве аргумента функции, которая ожидает нормальный указатель.
  • Вы не можете назначить нормальный указатель умному указателю.

Кроме того, вы можете обрабатывать умный указатель, как любой другой указатель, включая вызов виртуальных функций, и все будет правильно.

PS. Если возможно, я рекомендую вам перейти на интеллектуальные указатели C ++ 11. Они были «вдохновлены» (то есть более или менее прямо скопированы) умными указателями Boost, поэтому все, что вам действительно нужно сделать, это включить <memory> заголовочный файл и изменить, например, boost::shared_ptr в std::shared_ptr, Смотрите, например этот справочный сайт.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]