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

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

Barbara Streisand
リリース: 2024-12-03 10:54:17
オリジナル
215 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート