Указатель на std :: unique_ptr производного класса от базового класса - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь создать std::unique_ptr<BaseClass>*, который может указывать на любой std::unique_ptr<DerivedClass>.

У меня есть следующая иерархия классов:

[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

Как я могу сделать эту работу?

1 Ответ

2 голосов
/ 28 января 2020

Если вы хотите сослаться на объект, который принадлежит в другом месте вашего кода, std::shared_ptr - ваш путь к go (по крайней мере, если вы хотите добиться того, что вы показываете в примере, который это часть вашего вопроса). Затем, если вы хотите понизить базовый класс 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;
}

Кроме того, следующий код может имитировать c вашу ситуацию и то, что вы хотите добейтесь немного лучшего:

#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;
}

Обратите внимание, что приведенное выше решение может привести к нежелательному поведению повторного отпускания одного и того же указателя.

...