2013-07-09 56 views
0

我想用unique_ptr<NativeWindow>存儲一個指向我的本地窗口實例的指針,這樣當Window對象超出範圍時,它將保證被釋放。如何在C++'11中更改指針的所有權?

// This would be maintained by a window manager 
unique_ptr<Window> window; 

void Foo() { 
    NativeWindow *pNativeWindow = createNativeWindow(); 
    window = new Window(pNativeWindow); 
} 

// ... 

class Window { 
private: 
    unique_ptr<NativeWindow> _nativeWindow; 
public: 
    inline NativeWindow& GetNativeWindow() { 
     return *_nativeWindow; 
    } 

// ... 

Window::Window(NativeWindow&& nativeWindow) 
    : _nativeWindow(std::move(nativeWindow)) 
{ 
} 

我很難理解移動語義,並且會發現從這個例子中學習更容易。如果這是香草指針,我會很好,但我試圖理解新的方式!

+0

'unique_ptr second = first;' – 2013-07-09 16:44:01

+0

這裏沒有問題。 – Casey

+0

對不起,我應該已經更具體,我收到以上錯誤消息與上面的代碼: '錯誤1錯誤C2664:'std :: unique_ptr <_Ty> :: unique_ptr(std :: nullptr_t)throw()':can not將參數1從「NativeWindow」轉換爲「std :: nullptr_t'' –

回答

2

構造函數Window應取NativeWindow *而不是NativeWindow&&

Window::Window(NativeWindow* nativeWindow) 
    : _nativeWindow(nativeWindow) 
{ 
} 

這應該工作,但我建議你將參數更改爲unique_ptr<NativeWindow>代替。這表明Window對象正在承擔NativeWindow參數的所有權。

Window::Window(std::unique_ptr<NativeWindow> nativeWindow) 
    : _nativeWindow(std::move(nativeWindow)) 
{ 
} 
+3

理想情況下,'CreateNativeWindow'也應該返回'unique_ptr '。 – Casey

+0

好吧我已將我的代碼更改爲此,現在我從工廠函數返回'unique_ptr ',但仍然收到編譯錯誤。我有'window.reset(新窗口(的nativeWindow));'它說'錯誤C2248: '的std ::的unique_ptr <_Ty> ::的unique_ptr':不能訪問私有成員在類中聲明 '的std ::的unique_ptr <_Ty>''。如上所示,我將構造函數更改爲'Window :: Window(std :: unique_ptr nativeWindow)'。 –

+1

@LeaHayes聽起來好像你試圖在某處複製'unique_ptr'。如果你的'createNativeWindow'函數現在正在返回一個'unique_ptr',你就需要在調用構造函數的時候「移動」它。 'window.reset(new Window(std :: move(nativeWindow)));' – Praetorian