1. ホーム
  2. c++

[解決済み] unique_ptr を持つクラスのコピーコンストラクタ

2022-07-19 01:54:52

質問

を持つクラスに対して、コピーコンストラクタを実装するにはどうしたらよいでしょうか。 unique_ptr のメンバ変数を持つクラスのコピーコンストラクタを実装するにはどうしたらよいでしょうか?C++11のみ考えています。

どのように解決するのですか?

このため unique_ptr は共有できないので、そのコンテンツをディープコピーするか、または unique_ptrshared_ptr .

class A
{
   std::unique_ptr< int > up_;

public:
   A( int i ) : up_( new int( i ) ) {}
   A( const A& a ) : up_( new int( *a.up_ ) ) {}
};

int main()
{
   A a( 42 );
   A b = a;
}

NPE が言ったように、コピーベクトルではなくムーバークラクタを使うこともできますが、その場合、クラスのセマンティクスが変わってしまいます。ムーバベクタを使う場合は std::move :

A( A&& a ) : up_( std::move( a.up_ ) ) {}

必要な演算子一式を揃えることで、次のようなことも可能になります。

A& operator=( const A& a )
{
   up_.reset( new int( *a.up_ ) );
   return *this,
}

A& operator=( A&& a )
{
   up_ = std::move( a.up_ );
   return *this,
}

もし、あなたのクラスを std::vector の中で使いたい場合、基本的にベクトルがオブジェクトのユニークな所有者になるかどうかを決めなければなりませんが、その場合、クラスを移動可能にすることは十分ですが、コピー可能にすることはできません。copy-ctor と copy-assignment を省けば、コンパイラは移動専用の型を持つ std::vector をどのように使用するかを案内してくれます。