【问题标题】:How to dynamically cast a boost::scoped_ptr?如何动态转换 boost::scoped_ptr?
【发布时间】:2017-02-23 07:49:43
【问题描述】:

我很惊讶编译器拒绝编译这种代码:

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。

【问题讨论】:

  • boost::scoped_ptr 不允许共享或转让所有权

标签: c++ boost dynamic-cast c++98 scoped-ptr


【解决方案1】:

p1 拥有B 对象,并将在其析构函数中将其删除。如果您允许创建第二个智能指针 (p2),该指针也将删除其析构函数中的对象,那么您将遇到问题。

我个人会使用对引用而不是指针的强制转换,但除此之外,您找到了唯一的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多