2009-05-20 118 views
1

我有一些庫代碼(我不能改變源代碼),它返回一個指向對象(B)的指針。我想這個指針的shared_ptr類下存儲與這種類型的構造:convert pointer to shared_ptr

class A 
{ 
    public: 
    A(boost::shared_ptr<B> val); 
    ... 
    private: 
    boost::shared_ptr<B> _val; 
    ... 
}; 

int main() 
{ 
    B *b = SomeLib(); 
    A a(b); //?? 
    delete b; 
    ... 
} 

也就是說,我想提出的B A深拷貝和下控制其生命時間(即使原始b被刪除(刪除b),我仍然在a)下有一個確切的副本。

我是新來這個,如果它似乎對不起微不足道......

回答

2

就像你說的,你必須複製他們不只是複製一個指針。所以要麼B已經實現了'clone'方法,要麼你必須實現一些外部的B* copy(B* b),這將創建具有相同狀態的新B。

如果B已實現的拷貝構造函數可以實現副本只是

B* copyOf(B* b) 
{ 
    return new B(*b); 
} 

如果B已實現clone method or similar可以實現副本

B* copyOf(B* b) 
{ 
    return b->clone(); 
} 

,然後你的代碼看起來像

int main() 
{ 
    B *b = SomeLib(); 
    A a(copyOf(b)); 
    delete b; 
    ... 
} 
+0

我沒有看到使用函數`copy` ... – 2009-05-20 12:12:07

+0

在主函數的第二行。 – 2009-05-20 12:15:23

+0

@Mykola:我明白了 - 但我不明白這一點:它毫無意義。抱歉。 – 2009-05-20 13:59:26

1

深拷貝在C++中實現很普通通過自C++以來的拷貝構造函數,所有對象默認具有值語義。雖然以這種方式進行復制對於多態對象不起作用 - 在這種情況下,您必須在類中實現一個幾乎覆蓋的clone方法。

但在其他情況下,簡單地寫

A(boost::shared_ptr<B> val) : _val(new B(*val)) { } 

會做。

2

如果庫定義了該B對象,圖書館應用於複製B.

作爲旁註提供(或完全禁止)的機構,

如果類A被排他地控制這個壽命複製的對象,你真正想使用的智能指針是boost::scoped_ptr

boost::shared_ptr以其共享生命責任的能力命名,這聽起來像你不想要的。 scoped_ptr不會讓這個意外發生。