ホームページ > バックエンド開発 > C++ > クラスをコピーするときに一意のポインターを処理するにはどうすればよいですか?

クラスをコピーするときに一意のポインターを処理するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-15 16:00:24
オリジナル
698 人が閲覧しました

How to Handle Unique Pointers When Copying a Class?

クラス内の一意のポインターのコピー

一意のポインターをメンバーとして含むクラスをコピーするには、特別な考慮が必要です。一意のポインタは共有できないため、その内容のディープ コピーまたは共有ポインタへの変換が必要です。

ディープ コピー

ディープ コピー アプローチでは、新しい一意のポインタを作成し、元のポインタの内容のコピーで初期化します:

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

public:
   A(int i) : up_(new int(i)) {}
   A(const A& a) : up_(new int(*a.up_)) {}
};
ログイン後にコピー

ここでは、 A のコピー コンストラクターは、元の一意のポインターが指す int をディープ コピーします。

共有ポインターへの変換

または、一意のポインターを共有ポインターに変換することもできます。これにより、複数のオブジェクト間で共有できるようになります:

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

public:
   B(int i) : up_(new int(i)) {}
   B(const B& b)
   {
      up_ = std::make_shared(*b.up_);
   }
};
ログイン後にコピー

この例では、B のコピーコンストラクターは、一意のポインターを共有ポインターに変換し、B の複数のコピーが同じ基になるデータにアクセスできるようにします。

その他の演算子

std などのコンテナーとシームレスに連携するため::vector、追加の演算子は通常、必須:

  • 移動コンストラクター:

    B(B&& b)
    {
     up_ = std::move(b.up_);
    }
    ログイン後にコピー
  • コピー割り当て:

    B& operator=(const B& b)
    {
     up_ = std::make_shared(*b.up_);
     return *this;
    }
    ログイン後にコピー
  • 移動 割り当て:

    B& operator=(B&& b)
    {
     up_ = std::move(b.up_);
     return *this;
    }
    ログイン後にコピー

これらの演算子は、オブジェクトが確実にさまざまなコンテキストで安全に割り当ておよびコピーできます。

以上がクラスをコピーするときに一意のポインターを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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