[解決済み] unique_ptr を持つクラスのコピーコンストラクタ
2022-07-19 01:54:52
質問
を持つクラスに対して、コピーコンストラクタを実装するにはどうしたらよいでしょうか。
unique_ptr
のメンバ変数を持つクラスのコピーコンストラクタを実装するにはどうしたらよいでしょうか?C++11のみ考えています。
どのように解決するのですか?
このため
unique_ptr
は共有できないので、そのコンテンツをディープコピーするか、または
unique_ptr
を
shared_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_ ) ) {}
};
int main()
{
A a( 42 );
A b = a;
}
NPE が言ったように、コピーベクトルではなくムーバークラクタを使うこともできますが、その場合、クラスのセマンティクスが変わってしまいます。ムーバベクタを使う場合は
std::move
:
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
の中で使いたい場合、基本的にベクトルがオブジェクトのユニークな所有者になるかどうかを決めなければなりませんが、その場合、クラスを移動可能にすることは十分ですが、コピー可能にすることはできません。copy-ctor と copy-assignment を省けば、コンパイラは移動専用の型を持つ std::vector をどのように使用するかを案内してくれます。
関連
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] ベースクラスのコンストラクタを呼び出す際のルールは?
-
[解決済み] 関数からunique_ptrを返す
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] C++ 削除された関数の使用エラー
-
[解決済み] クラスメンバにスマートポインタを使用する