C++ 如何在C++';11?

C++ 如何在C++';11?,c++,std,move-semantics,unique-ptr,C++,Std,Move Semantics,Unique Ptr,我想使用unique\ptr存储一个指向本机窗口实例的指针,这样当window对象超出范围时,它就会被释放 // This would be maintained by a window manager unique_ptr<Window> window; void Foo() { NativeWindow *pNativeWindow = createNativeWindow(); window = new Window(pNativeWindow); } //

我想使用
unique\ptr
存储一个指向本机窗口实例的指针,这样当
window
对象超出范围时,它就会被释放

// 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))
{
}
//这将由窗口管理器维护
独特的ptr窗口;
void Foo(){
NativeWindow*pNativeWindow=createNativeWindow();
窗口=新窗口(pNativeWindow);
}
// ...
类窗口{
私人:
唯一的_ptr _nativeWindow;
公众:
内联NativeWindow和GetNativeWindow(){
返回*_nativeWindow;
}
// ...
窗口::窗口(NativeWindow&&NativeWindow)
:_nativeWindow(标准::移动(nativeWindow))
{
}

我很难理解移动语义,并且会发现从这个例子中学习起来更容易。如果这是普通的指针,我会很好,但我正在尝试理解新的方式!

窗口
构造函数应该采用
NativeWindow*
,而不是
NativeWindow&

Window::Window(NativeWindow* nativeWindow)
    : _nativeWindow(nativeWindow)
{
}
这应该行得通,但我建议您将参数改为
unique\u ptr
。这表明
Window
对象假定拥有
NativeWindow
参数

Window::Window(std::unique_ptr<NativeWindow> nativeWindow)
    : _nativeWindow(std::move(nativeWindow))
{
}
Window::Window(std::unique\u ptr nativeWindow)
:_nativeWindow(标准::移动(nativeWindow))
{
}

unique\u ptr second=first;
这里没有问题。对不起,我应该说得更具体一些,我收到了以下错误消息,上面的代码是:
错误1错误C2664:'std::unique\u ptr::unique\u ptr(std::nullptr\t)throw()“:无法将参数1从“NativeWindow”转换为“std::nullptr\u t”
@H2CO3 Not
unique\u ptr second=std::move(first);
?@H2CO3不,它仍然不起作用。
unique\u ptr
不会转移所有权,除非您明确地
std::move
.release()
托管指针。如果它按照您所说的那样做,我们就不需要它了,
auto_ptr
就足够了。理想情况下,
CreateNativeWindow
也应该返回
unique_ptr
。好的,我已经将代码更改为这个,现在从我的工厂函数返回
unique_ptr
,但我仍然得到一个编译错误。我有
window.reset(newwindow(nativeWindow));
它说
错误C2248:'std::unique\u ptr::unique\u ptr':无法访问类'std::unique\u ptr'
中声明的私有成员。我已将构造函数更改为
window::window(std::unique\u ptr nativeWindow)
如上所述。@LeaHayes听起来像是你在试图将
唯一的ptr
复制到某个地方。如果你的
createNativeWindow
函数现在返回一个
唯一的ptr
,你需要在调用构造函数时移动它。
窗口。重置(新窗口(std::move(nativeWindow)))
是的,就是这样,现在编译得很好:)所以在C++'11中,似乎需要相当多的
std::move
。@LeaHayes当您想要指示某个对象可以从中移动时,它是需要的。在这种情况下,您可以通过使用
window.reset(新窗口(createNativeWindow());
(响应您上面的评论)
auto_ptr
已弃用。