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 Notunique\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
已弃用。