如何从继承的父 class 创建 unique_ptr
how to create unique_ptr from inherited parent class
有没有办法从继承的 类 中创建一个 unique_ptr
?
我需要能够 "register" MouseListeners
与经理联系,但我不知道如何创建继承 MouseListener
.[=28 的 unique_ptr
=]
错误是找不到从Window *
到MouseListener
的转换。我试过 static_cast
但会产生其他错误。我还尝试将 raw pointer
传递给 addMouseListener
,它确实有效但在关闭程序时出错,因为我认为它没有创建导致 delete
失败的适当内存。
还使用 std::move()
转移所有权,这会导致侦听器不触发事件。
// Window.h
class Window : public MouseManager, public MouseListener {
public:
Window::Window(std::string title, int32_t width, int32_t height) {
...
this->addMouseListener(std::make_unique<MouseListener>(this)); // ERROR
}
};
// MouseManager.h
void MouseManager::addMouseListener(std::unique_ptr<MouseListener> listener) {
m_listeners.emplace_back(listener);
}
// MouseListener.h
MouseListener() = default;
virtual ~MouseListener() = default;
MouseListener(const MouseListener& listener) = default;
MouseListener(MouseListener&& listener) noexcept ;
MouseListener& operator=(const MouseListener& listener) = delete;
MouseListener& operator=(MouseListener&& listener) = delete;
错误输出
In file included from /Users/Programmer/CLionProjects/StormEngine/Engine/Window/Window.cpp:5:
In file included from /Users/Programmer/CLionProjects/StormEngine/Engine/Window/Window.h:8:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:3141:32: error: no matching constructor for initialization of 'MouseListener'
return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...));
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/Programmer/CLionProjects/StormEngine/Engine/Window/Window.cpp:17:33: note: in instantiation of function template specialization 'std::__1::make_unique<MouseListener, Window *>' requested here
this->addMouseListener(std::make_unique<MouseListener>(this));
^
/Users/Programmer/CLionProjects/StormEngine/Engine/Window/../Events/Listeners/MouseListener.h:19:5: note: candidate constructor not viable: no known conversion from 'Window *' to 'const MouseListener' for 1st argument; dereference the argument with *
MouseListener(const MouseListener& listener) = default;
^
/Users/Programmer/CLionProjects/StormEngine/Engine/Window/../Events/Listeners/MouseListener.h:20:5: note: candidate constructor not viable: no known conversion from 'Window *' to 'MouseListener' for 1st argument; dereference the argument with *
MouseListener(MouseListener&& listener) noexcept ;
^
/Users/Programmer/CLionProjects/StormEngine/Engine/Window/../Events/Listeners/MouseListener.h:16:5: note: candidate constructor not viable: requires 0 arguments, but 1 was provided
MouseListener() = default;
^
更新:
取消引用 this
添加了一个新问题,在其中添加变量 listener
你必须 std::move()
这会导致所有权变更,如上所述导致事件不火。
make unique 生成该类型的对象并returns指向它的指针。
它不会将指向对象的预先存在的指针包装到唯一的指针中。
您的 addMouseListener(std::unique_ptr<MouseListener>)
函数 取得侦听器的所有权。在这里传递预先存在的对象通常不是一个好主意。
可能 Window
不应该从 MouseListener
继承,而是创建一个 MouseListener
,它又有一个指向 Window
的指针,并以某种方式进行生命周期管理以确保Window
还活着,或者当 Window
死后我们会断开连接。
MouseListener
应该中继 消息到 window,而不是 window .
std::make_unique<MouseListener>(this)
这将分配一个新的 MouseListener
实例,并将 this
作为构造函数的参数。正如错误消息所解释的那样,没有构造函数 MouseListener:MouseListener(Window*)
或任何其他带有 Window*
可以隐式转换为的参数的构造函数。
您可能不打算创建一个新的 MouseListener
实例,而是想要一个指向 this
的唯一指针。您可以使用构造函数 explicit unique_ptr(pointer p)
:
创建 unique_ptr
到 this
std::unique_ptr<Window>(this)
这个指针可以传递给MouseManager::addMouseListener
。请注意,虽然派生唯一指针的转换是隐式的,但不能直接从裸派生指针构造基本唯一指针,因为构造函数是显式的。
请注意,创建指向 this
的唯一指针可能是一个可疑的想法。它将 Window
对象的创建限制为使用 new
,并且显然(从分配代码的角度来看)泄漏了指针。任何其他代码都不能拥有任何 windows(除非从最初存储它的容器中移出),并且您永远不能拥有自动实例。
有没有办法从继承的 类 中创建一个 unique_ptr
?
我需要能够 "register" MouseListeners
与经理联系,但我不知道如何创建继承 MouseListener
.[=28 的 unique_ptr
=]
错误是找不到从Window *
到MouseListener
的转换。我试过 static_cast
但会产生其他错误。我还尝试将 raw pointer
传递给 addMouseListener
,它确实有效但在关闭程序时出错,因为我认为它没有创建导致 delete
失败的适当内存。
还使用 std::move()
转移所有权,这会导致侦听器不触发事件。
// Window.h
class Window : public MouseManager, public MouseListener {
public:
Window::Window(std::string title, int32_t width, int32_t height) {
...
this->addMouseListener(std::make_unique<MouseListener>(this)); // ERROR
}
};
// MouseManager.h
void MouseManager::addMouseListener(std::unique_ptr<MouseListener> listener) {
m_listeners.emplace_back(listener);
}
// MouseListener.h
MouseListener() = default;
virtual ~MouseListener() = default;
MouseListener(const MouseListener& listener) = default;
MouseListener(MouseListener&& listener) noexcept ;
MouseListener& operator=(const MouseListener& listener) = delete;
MouseListener& operator=(MouseListener&& listener) = delete;
错误输出
In file included from /Users/Programmer/CLionProjects/StormEngine/Engine/Window/Window.cpp:5:
In file included from /Users/Programmer/CLionProjects/StormEngine/Engine/Window/Window.h:8:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:3141:32: error: no matching constructor for initialization of 'MouseListener'
return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...));
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/Programmer/CLionProjects/StormEngine/Engine/Window/Window.cpp:17:33: note: in instantiation of function template specialization 'std::__1::make_unique<MouseListener, Window *>' requested here
this->addMouseListener(std::make_unique<MouseListener>(this));
^
/Users/Programmer/CLionProjects/StormEngine/Engine/Window/../Events/Listeners/MouseListener.h:19:5: note: candidate constructor not viable: no known conversion from 'Window *' to 'const MouseListener' for 1st argument; dereference the argument with *
MouseListener(const MouseListener& listener) = default;
^
/Users/Programmer/CLionProjects/StormEngine/Engine/Window/../Events/Listeners/MouseListener.h:20:5: note: candidate constructor not viable: no known conversion from 'Window *' to 'MouseListener' for 1st argument; dereference the argument with *
MouseListener(MouseListener&& listener) noexcept ;
^
/Users/Programmer/CLionProjects/StormEngine/Engine/Window/../Events/Listeners/MouseListener.h:16:5: note: candidate constructor not viable: requires 0 arguments, but 1 was provided
MouseListener() = default;
^
更新:
取消引用 this
添加了一个新问题,在其中添加变量 listener
你必须 std::move()
这会导致所有权变更,如上所述导致事件不火。
make unique 生成该类型的对象并returns指向它的指针。
它不会将指向对象的预先存在的指针包装到唯一的指针中。
您的 addMouseListener(std::unique_ptr<MouseListener>)
函数 取得侦听器的所有权。在这里传递预先存在的对象通常不是一个好主意。
可能 Window
不应该从 MouseListener
继承,而是创建一个 MouseListener
,它又有一个指向 Window
的指针,并以某种方式进行生命周期管理以确保Window
还活着,或者当 Window
死后我们会断开连接。
MouseListener
应该中继 消息到 window,而不是 window .
std::make_unique<MouseListener>(this)
这将分配一个新的 MouseListener
实例,并将 this
作为构造函数的参数。正如错误消息所解释的那样,没有构造函数 MouseListener:MouseListener(Window*)
或任何其他带有 Window*
可以隐式转换为的参数的构造函数。
您可能不打算创建一个新的 MouseListener
实例,而是想要一个指向 this
的唯一指针。您可以使用构造函数 explicit unique_ptr(pointer p)
:
unique_ptr
到 this
std::unique_ptr<Window>(this)
这个指针可以传递给MouseManager::addMouseListener
。请注意,虽然派生唯一指针的转换是隐式的,但不能直接从裸派生指针构造基本唯一指针,因为构造函数是显式的。
请注意,创建指向 this
的唯一指针可能是一个可疑的想法。它将 Window
对象的创建限制为使用 new
,并且显然(从分配代码的角度来看)泄漏了指针。任何其他代码都不能拥有任何 windows(除非从最初存储它的容器中移出),并且您永远不能拥有自动实例。