2015-09-24 61 views
11

我有一個類foo,與std::shared_ptr<int>類型的成員bar分配到一個std :: shared_ptr的成員變量

class foo 
{ 
    std::shared_ptr<int> bar; 
    /*other stuff here*/ 
}; 

那堂課我要分配給new intbar。但是我不能寫bar = new int();,因爲指針沒有公共賦值操作符。

如何應該我這樣做?我可以std::movestd::swap,但這些都不對。

回答

10

您可以使用reset此:

bar.reset(new int()); 

這將delete當前內容(如果有的話)和內部指針設置爲通過new表達式返回。

13

bar = std::make_shared<int>();是一種方法,特別是如果您想保留賦值運算符的易處理性。

+0

看到您的編輯。這種改變是否還會將'int'初始化爲0? 'new int()'會,'new int'不會。 – Bathsheba

+2

'std :: make_shared (new int())'無效; 'make_shared'完美地將參數傳遞給'T'構造函數。它指定使用':: new(pv)T(std :: forward (args)...)'構造對象,所以如果沒有參數,它將被初始化。 – TartanLlama

+1

@Bathsheba:沒錯,沒有「未初始化」的任何'make_ *'函數形式。我認爲這樣的提議曾經提出過一次(作爲允許make_ {shared,unique}的大小數組類型的提議的一部分),並且提案帶有一個使用默認初始化的make _ * _ uninitialized形式。一般來說,標準庫使得產生未初始化的值非常困難,即使有時候這就是你所需要的... –

相關問題