1

我需要根据条件初始化 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 中所示的条件初始化)。

4

3 回答 3

3

您可以使用.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>();
于 2012-10-21T11:01:53.340 回答
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>());
于 2012-10-21T11:04:20.903 回答
0

这不行吗?

void some_func(int opt)
{
   boost::shared_ptr<A> abstract_ptr((opt == RELEVENT_TO_B) ? (A*) new B ? (A*) new C));
}
于 2012-10-21T11:05:38.060 回答