【问题标题】:Pointer to a std::unique_ptr of derived class from base class指向来自基类的派生类的 std::unique_ptr 的指针
【发布时间】:2020-01-27 21:20:34
【问题描述】:

我正在尝试创建一个可以指向任何std::unique_ptr<DerivedClass>std::unique_ptr<BaseClass>*

我有以下类层次结构:

[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::unique_ptr的指针?
  • 听起来你要么想要一个原始指针,要么想要一个shared_ptr。您似乎不想拥有该工具的所有权,因此DrawingTool * active_tool; 在这里可能会更有用。
  • 请注意some_template_type&lt;T&gt;some_template_type&lt;U&gt; 是完全不同的类型。
  • @NutCracker 我对 C++ 很陌生,所以也许我采用了错误的方法 - 但我的想法是我不想共享类的所有权(使用原始指针或 shared_ptr ),我只想引用一个在别处拥有的类。
  • @JShorthouse:“我只想引用一个在别处拥有的类。”但这只是传递一个引用。或原始指针。

标签: c++ pointers polymorphism smart-pointers c++-standard-library


【解决方案1】:

如果您想引用代码中其他地方拥有的对象,std::shared_ptr 是您的选择(至少如果您想实现您在示例中显示的内容,这是您问题的一部分)。然后,如果您想将基类 std::shared_ptr 向下转换为派生类 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;
}

请注意,上述解决方案可能会导致释放同一指针两次的不良行为。

【讨论】:

  • 感谢您的回答,但在考虑了更多之后,我认为也许只是使用原始指针可能是另一位评论者建议的最佳解决方案。你怎么看?您的 shared_ptr 解决方案很好,但我认为它传达了错误的意图。我从不希望主类拥有该对象。对我来说,使用 shared_ptr 表明两个类将拥有相同的所有权。同样在您的第二个解决方案中,我可能会遗漏一些东西,但是您是说两个 unique_ptrs 都应该指向相同的值吗?这不会使它们变得不安全并破坏它们的全部目的吗?
  • 正如我之前所说,我对 C++ 还很陌生,所以请随时纠正我的任何错误假设。
  • 我认为您应该选择std::shared_ptr 解决方案,因为在现代 C++ 中使用原始指针并不是最佳实践。是的,第二种解决方案可能会导致在 main 结束时两次释放相同指针的不良行为。我忘了把它添加到我的答案中
  • 好的,感谢您的澄清,我将切换到使用共享指针。
猜你喜欢
  • 2016-02-19
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 2020-02-11
相关资源
最近更新 更多