クラス内の一意のポインターのコピー
一意のポインターをメンバーとして含むクラスをコピーするには、特別な考慮が必要です。一意のポインタは共有できないため、その内容のディープ コピーまたは共有ポインタへの変換が必要です。
ディープ コピー
ディープ コピー アプローチでは、新しい一意のポインタを作成し、元のポインタの内容のコピーで初期化します:
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 サイトの他の関連記事を参照してください。