ホームページ > バックエンド開発 > C++ > 「unique_ptr」メンバーを含む C 11 クラスを適切にコピーするにはどうすればよいですか?

「unique_ptr」メンバーを含む C 11 クラスを適切にコピーするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-03 00:30:10
オリジナル
843 人が閲覧しました

How to Properly Copy C  11 Classes Containing `unique_ptr` Members?

C 11 での一意のポインターを持つクラスのコピー

排他的所有権を強制するスマート ポインターである unique_ptr を含むクラスのコピー コンストラクターの作成、独特の課題をもたらします。 C 11 では、 unique_ptr メンバーの管理には慎重な考慮が必要です。

解決策:

コピー コンストラクターを実装するには、2 つのオプションがあります:

  1. ディープ コピー: unique_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_)) {}
};
ログイン後にコピー
  1. shared_ptr に変換: unique_ptr をshared_ptr に変換します。これにより、複数の所有者が許可されます。
std::shared_ptr<int> sp = std::make_shared<int>(*up_);
ログイン後にコピー

追加考慮事項:

  • 移動コンストラクター: コピー コンストラクターの代わりに、unique_ptr の所有権を譲渡する移動コンストラクターを使用できます。
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 内のクラスを使用して、そのベクターがオブジェクトを排他的に所有するかどうかを決定します。コピー コンストラクターとコピー代入演算子を省略することで、移動のみの動作を強制できます。

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

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