2015-06-05 89 views
0

這個問題與我的程序有關。我之前使用手動管理使用指針,現在我試圖移動到智能指針(出於所有理由)。處理構造函數時的智能指針

在正常的指針中,通過使用新的關鍵字很容易調用類的構造函數。像下面的程序一樣:

Button * startButton; 

startButton = new Button(int buttonID, std::string buttonName); 

當使用智能指針時,什麼是調用類的構造函數的替代方法。我已經做了下面給出了一個錯誤:

std::unique_ptr<Button> startButton; 

startButton = std::unique_ptr<Button>(1, "StartButton"); // Error 

我收到的錯誤如下:

Error 2 error C2661: 'std::unique_ptr<Button,std::default_delete<_Ty>>::unique_ptr' : no overloaded function takes 2 arguments 
+1

[make_unique](http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique) – user657267

回答

4

std::unique_ptr是圍繞一個指針的包裝,以便創造一個std::unique_ptr正確的對象,你應該將指針傳遞給它的構造函數:

startButton = std::unique_ptr<Button>(new Button(1, "StartButton"));

由於C++ 14也有一個輔助函數make_unique這確實該分配你引擎蓋下:

startButton = std::make_unique<Button>(1, "StartButton"); 

喜歡使用std::make_unique如果它是可用的,因爲它使用它是比直接使用new更安全更容易閱讀和在某些情況下。

+1

在C++ 11中缺少'make_unique'是委員會的一個簡單疏忽,但你可以就像在[this](http://stackoverflow.com/a/12580468/1070117)中指出的那樣,在C++ 11中簡單地構建自己的'make_unique'實現。 – Leandros

1

如果您有支持C++ 14編譯器,你可以使用:

startButton = std::make_unique<Button>(1, "StartButton"); 

如果您只能使用C++ 11,你需要使用:

startButton = std::unique_ptr<Button>(new Button(1, "StartButton"));