如何从继承的父类创建unique_ptr
how to create unique_ptr from inherited parent class
有没有办法从继承的类之一创建unique_ptr
?
我需要能够向经理"注册"MouseListeners
,但我无法弄清楚如何创建继承MouseListener
的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创建该类型的对象并返回指向它的指针。
它不会将指向对象的预先存在的指针包装到唯一的 ptr 中。
您的addMouseListener(std::unique_ptr<MouseListener>)
函数取得侦听器的所有权。 在这里,传递预退出对象通常不是一个好主意。
可能Window
不应该从MouseListener
继承,而是创建一个MouseListener
,而又有一个指向Window
的指针,并以某种方式进行生命周期管理,以确保活着的Window
留在身边,或者在Window
死亡时我们断开连接。
MouseListener
应将消息中继到窗口,而不是窗口。
std::make_unique<MouseListener>(this)
这将分配一个新的MouseListener
实例,this
作为构造函数的参数。正如错误消息所解释的那样,没有构造函数MouseListener:MouseListener(Window*)
或任何其他构造函数具有可以将Window*
隐式转换为的参数。
您可能不打算创建新的MouseListener
实例,而是想要一个指向this
的唯一指针。您可以使用构造函数explicit unique_ptr(pointer p)
创建要this
unique_ptr
:
std::unique_ptr<Window>(this)
此指针可以传递给MouseManager::addMouseListener
。请注意,虽然从 deriver 唯一指针的转换是隐式的,但基唯一指针不能直接从裸派生指针构造,因为构造函数是显式的。
请注意,创建指向this
的唯一指针可能是一个可疑的想法。它将Window
对象的创建限制为使用new
,并且显然(从分配的代码的角度来看(泄漏了指针。没有其他代码可以拥有任何窗口(除非从最初存储它的容器中移动(,并且您永远不能拥有自动实例。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 为什么 std::unique 不调用 std::sort?
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 终端不会为C++文件创建.exe文件吗