ホームページ >バックエンド開発 >C++ >C 11 で `unique_ptr` メンバーを持つクラスのコピー コンストラクターを実装するにはどうすればよいですか?

C 11 で `unique_ptr` メンバーを持つクラスのコピー コンストラクターを実装するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-03 10:54:17140ブラウズ

How to Implement Copy Constructors for Classes with `unique_ptr` Members in C  11?

unique_ptr メンバーを持つクラスのコピー コンストラクターの実装

unique_ptr メンバー変数を利用するクラスを操作する場合、コピー コンストラクターの実装が重要になります。この記事では、そのようなクラス用に C 11 でコピー コンストラクターを作成する手法について詳しく説明します。

unique_ptr は共有できないため、その内容を深くコピーするか、shared_ptr に変換することが不可欠です。次の例は、ディープ コピーを示しています。

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

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

このアプローチでは、新しい unique_ptr が割り当てられ、元のポインターのコンテンツのコピーが割り当てられます。

あるいは、代わりに移動コンストラクターを利用することもできます。コピー コンストラクターの:

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

ただし、このメソッドでは、コピー コンストラクターの所有権が譲渡されるため、異なるセマンティクスが導入されます。ソース オブジェクトからターゲット オブジェクトへの unique_ptr。

完全を期すため、代入演算子の完全なセットは次のようになります。

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

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

コピー コンストラクターを使用するか移動コンストラクターを使用するかは、コンテキストによって決まります。クラスが std::vector で使用されることを目的としている場合、クラスを移動専用にするかコピー可能にするかの選択は、ベクターがオブジェクトの唯一の所有者であるべきかどうかによって影響されます。

以上がC 11 で `unique_ptr` メンバーを持つクラスのコピー コンストラクターを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。