Как правильно сделать объект владельцем другого полиморфного объекта? - PullRequest
0 голосов
/ 27 января 2019

Я ищу безопасный и чистый способ заставить объект владеть другим (полиморфным!) Объектом, с которым он инициализируется в конструкторе.Кроме того, я хочу сделать его доступным с помощью геттера.

После сканирования нескольких блогов и постов на SO, я предполагаю, что лучше всего это сделать с помощью std::unique_ptr и выяснил это:

#include <memory>

class owned {};

class owner {
    const std::unique_ptr<const owned> m_owned;
public:
    owner(std::unique_ptr<const owned>&& o) : m_owned{ std::move(o) } {}
    const owned& owned() const { return *m_owned; }
};

int main() {
    std::unique_ptr<owned> _owned{ std::make_unique<owned>(owned()) };
    owner _owner(std::move(_owned));
}

Однако я не очень знаком с деталями std::unique_ptr и поэтому не уверен, является ли это хорошим способом реализовать мою идею.Особенно двойное использование std::move заставляет меня сомневаться ...

Итак, вопрос: Является ли это предпочтительным способом передачи права собственности на полиморфный объект другому объекту и обеспечения его доступности?Если нет, то является лучшим способом сделать это?

1 Ответ

0 голосов
/ 27 января 2019

выглядит хорошо. Я бы бросил && в одном месте:

owner(std::unique_ptr<const owned> o) :

потому что это не нужно.

Один гоча; если вы добавите owner(owner&&)=default;, тогда owned может иногда быть пустым. Таким образом, способ обнаружить это состояние хорош.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...