从基 class 派生 class 的 std::unique_ptr 的指针
Pointer to a std::unique_ptr of derived class from base class
我正在尝试创建一个可以指向任何 std::unique_ptr<DerivedClass>
.
的 std::unique_ptr<BaseClass>*
我有以下 class 层次结构:
[InputHandler] <--inherits from-- [DrawingTool] <--inherits from-- [ToolName]
以及以下代码:
std::unique_ptr<DrawingTool> *active_tool;
active_tool = tool_manager.getCurTool(); // Returns a unique_ptr<DrawingTool>*
std::unique_ptr<InputHandler> *cur_input_handler = active_tool;
然而这给出了错误:
error: cannot convert ‘std::unique_ptr<DrawingTool>*’ to ‘std::unique_ptr<InputHandler>*’ in initialization
我怎样才能完成这项工作?
如果您想引用代码中别处拥有的对象,std::shared_ptr
是您的方法(至少如果您想实现示例中显示的内容,这是您的代码的一部分题)。然后,如果你想将基础 class std::shared_ptr
向下转换为派生的 class std::shared_ptr
你可以执行以下操作:
#include <iostream>
#include <memory>
struct Base {};
struct Derived : Base {};
int main() {
std::shared_ptr<Base> base = std::make_shared<Base>();
std::shared_ptr<Derived> derived = std::static_pointer_cast<Derived>(base);
return 0;
}
此外,以下代码可能会模仿您的情况以及您想要更好地实现的目标:
#include <iostream>
#include <memory>
struct Base {};
struct Derived : Base {};
std::unique_ptr<Base> const& get_unique_ptr() {
static std::unique_ptr<Base> base = std::make_unique<Base>();
return base;
}
int main() {
std::unique_ptr<Base> const& base = get_unique_ptr();
std::unique_ptr<Derived> derived(static_cast<Derived*>(base.get()));
return 0;
}
请注意,上述解决方案可能会导致释放同一指针两次的意外行为。
我正在尝试创建一个可以指向任何 std::unique_ptr<DerivedClass>
.
std::unique_ptr<BaseClass>*
我有以下 class 层次结构:
[InputHandler] <--inherits from-- [DrawingTool] <--inherits from-- [ToolName]
以及以下代码:
std::unique_ptr<DrawingTool> *active_tool;
active_tool = tool_manager.getCurTool(); // Returns a unique_ptr<DrawingTool>*
std::unique_ptr<InputHandler> *cur_input_handler = active_tool;
然而这给出了错误:
error: cannot convert ‘std::unique_ptr<DrawingTool>*’ to ‘std::unique_ptr<InputHandler>*’ in initialization
我怎样才能完成这项工作?
如果您想引用代码中别处拥有的对象,std::shared_ptr
是您的方法(至少如果您想实现示例中显示的内容,这是您的代码的一部分题)。然后,如果你想将基础 class std::shared_ptr
向下转换为派生的 class std::shared_ptr
你可以执行以下操作:
#include <iostream>
#include <memory>
struct Base {};
struct Derived : Base {};
int main() {
std::shared_ptr<Base> base = std::make_shared<Base>();
std::shared_ptr<Derived> derived = std::static_pointer_cast<Derived>(base);
return 0;
}
此外,以下代码可能会模仿您的情况以及您想要更好地实现的目标:
#include <iostream>
#include <memory>
struct Base {};
struct Derived : Base {};
std::unique_ptr<Base> const& get_unique_ptr() {
static std::unique_ptr<Base> base = std::make_unique<Base>();
return base;
}
int main() {
std::unique_ptr<Base> const& base = get_unique_ptr();
std::unique_ptr<Derived> derived(static_cast<Derived*>(base.get()));
return 0;
}
请注意,上述解决方案可能会导致释放同一指针两次的意外行为。