2012-10-21 66 views
1

我需要根據條件初始化boost :: shared_ptr。示例代碼在下面描述了我可以尋找的場景。使用RAW指針條件初始化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); 
    } 
} 

我知道,上面的代碼示例是錯誤的。在some_func()的第二行boost::shared_ptr<A> Abstract_ptr將創建一個shared_ptr對象,其中不帶任何參數的shared_ptr constrcutor,因爲沒有賦值操作符定義,並且沒有shared_ptr在初始化後獲取原始指針,所以if-else內的代碼是錯誤的。

我的問題是,我如何可以實現這一點(條件初始化,如some_func所示)適度boost :: shared_ptr。

+0

http://stackoverflow.com/questions/3305801/c-shared-ptr-attach-to-a-new-raw-pointer?rq=1 – alestanis

回答

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>(); 
+0

我想一起去make_shared解決方案。但是,它給編譯錯誤說明make_shared不是boost的一部分。我不知道它是否被棄用。雖然,重置選項正常工作。謝謝.. –

+1

@ManishShukla:你可能需要包含''來使用'make_shared'。 – kennytm

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>()); 
0

這是不是工作?

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