我需要根据条件初始化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中显示的条件初始化)。
答案 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));
}