Как динамически наложить boost :: scoped_ptr?

Я удивлен, что компилятор отказывается компилировать такой код:

class A { virtual ~A() {} };
class B : public A { virtual ~B() {} void foo() {} };
//...
boost::scoped_ptr<A> p1(new B);
boost::scoped_ptr<B> p2 = boost::dynamic_pointer_cast<B>(p1);
p2->foo();

Почему это невозможно? Каков наилучший способ сделать это?

Я нашел это решение:

boost::scoped_ptr<A> p1(new B);
B* p2 = dynamic_cast<B*>(p1.get());
p2->foo();

Есть ли способ использовать только интеллектуальные указатели?

Примечание: я не использую C ++ 11 для совместимости.

0

Решение

p1 владеет B объект, и удалит его в деструкторе. Если вы разрешили создание второго умного указателя (p2), который также собирался удалить объект в его деструкторе, у вас возникнет проблема.

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

1

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

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

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