[C++] Копировать конструктор для класса с unique_ptr


Answers

Попробуйте этот помощник для создания глубоких копий и справитесь, когда source unique_ptr имеет значение null.

    template< class T >
    std::unique_ptr<T> copy_unique(const std::unique_ptr<T>& source)
    {
        return source ? std::make_unique<T>(*source) : nullptr;
    }

Например:

class My
{
    My( const My& rhs )
        : member( copy_unique(rhs.member) )
    {
    }

    // ... other methods

private:
    std::unique_ptr<SomeType> member;
};
Question

Как реализовать конструктор копирования для класса с переменной-членом unique_ptr ? Я рассматриваю только C ++ 11.




Дэниел Фрей упомянул о решении для копирования, я бы рассказал о том, как переместить unique_ptr

#include <memory>
class A
{
  public:
    A() : a_(new int(33)) {}

    A(A &&data) : a_(std::move(data.a_))
    {
    }

    A& operator=(A &&data)
    {
      a_ = std::move(data.a_);
      return *this;
    }

  private:
    std::unique_ptr<int> a_;
};

Они называются конструкторами перемещения и назначением перемещения

вы можете использовать их так

int main()
{
  A a;
  A b(std::move(a)); //this will call move constructor, transfer the resource of a to b

  A c;
  a = std::move(c); //this will call move assignment, transfer the resource of c to a

}

Вам нужно обернуть a и c с помощью std :: move, потому что у них есть имя std :: move сообщает компилятору преобразовать значение в rvalue reference независимо от параметров. В техническом смысле std :: move аналогичен чему-то вроде " станд :: Rvalue»

После перемещения ресурс unique_ptr переносится на другой unique_ptr

Есть много тем, которые документируют ссылку rvalue; это довольно легко начать .

Редактировать :

Перемещенный объект остается в силе, но неопределенным .

C ++ primer 5, ch13 также дают очень хорошее объяснение того, как «перемещать» объект






Links