使用RAW指针有条件地初始化boost :: shared_ptr变量

时间:2012-10-21 10:54:26

标签: c++ pointers boost c++11 shared-ptr

我需要根据条件初始化boost :: shared_ptr。下面的示例代码描述了我正在寻找的场景。

class A{};
class B:public A{};
class C:public A();

void some_func(int opt)
{
   boost::shared_ptr<A> abstract_ptr;
   if(opt==RELEVENT_TO_B)
   {
      abstract_ptr(new B);
   }
   else
   {
      abstract_ptr(new C);
   }
}

我知道,上面的代码示例是错误的。 boost::shared_ptr<A> Abstract_ptr第二行中的some_func()将创建一个shared_ptr对象,其中shared_ptr constrcutor不带参数,因为没有定义赋值运算符,并且初始化后没有shared_ptr接受原始指针,所以if-else中的代码是错误。

我的问题是,我如何使用boost :: shared_ptr适度地实现这一点(some_func中显示的条件初始化)。

3 个答案:

答案 0 :(得分:3)

您可以use .reset()将原始指针放到共享指针上。

   boost::shared_ptr<A> abstract_ptr;
   if (opt == RELEVENT_TO_B)
      abstract_ptr.reset(new B);
   else
      abstract_ptr.reset(new C);

您也可以直接为其分配共享ptr:

   boost::shared_ptr<A> abstract_ptr;
   if (opt == RELEVENT_TO_B)
      abstract_ptr = boost::make_shared<B>();
   else
      abstract_ptr = boost::make_shared<C>();

答案 1 :(得分:1)

首先,做你已经完成的工作不是问题,即重新分配共享指针:

boost::shared_ptr<A> abstract_ptr;
if(opt==RELEVENT_TO_B)
   abstract_ptr = boost::make_shared<B>();
else
   abstract_ptr = boost::make_shared<C>();

上面第一行的效果是空指针被包装在共享指针中,重新赋值的效果是当前包装对象的引用计数递减,而新指定的引用计数的引用计数递减对象递增。没问题。

或者,如果你想将它全部保存在一行上,你可以使用条件运算符:

boost::shared_ptr<A> abstract_ptr = (opt==RELEVANT_TO_B ? boost::make_shared<B>() : boost::make_shared<C>());

答案 2 :(得分:0)

这不会起作用吗?

void some_func(int opt)
{
   boost::shared_ptr<A> abstract_ptr((opt == RELEVENT_TO_B) ? (A*) new B ? (A*) new C));
}