2015-09-24 11 views
11

の割り当て:は、私がタイプ<code>std::shared_ptr<int></code>のメンバー<code>bar</code>で、クラス<code>foo</code>を持っているのstd :: shared_ptrのメンバ変数に

class foo 
{ 
    std::shared_ptr<int> bar; 
    /*other stuff here*/ 
}; 

そのクラスで私はnew intbarを割り当てます。しかし、私はbar = new int();と書くことができません。ポインタにはパブリック代入演算子がありません。

どのようにする必要があります私はこれを行いますか?私はstd::moveまたはstd::swapでしたが、どちらも正しいように見えませんでした。

答えて

10

あなたはこのためにresetを使用することができます。これは、現在の内容をdelete(もしあれば)とnew式によって戻されることに内部ポインタを設定します

bar.reset(new int()); 

13

bar = std::make_shared<int>();は、特に代入演算子の扱いやすさを保持したい場合は、一方向です。

+0

編集しました。その変更はまだ 'int'を0に初期化しますか? 'new int()'は 'new int'には適用されません。 – Bathsheba

+2

'std :: make_shared (new int())'は無効です。 'make_shared'は' T'コンストラクタに引数を完全に転送します。 ':: new(pv)T(std :: forward (args)...)'を使ってオブジェクトを構築するように指定されているので、argsがなければ値で初期化されます。 – TartanLlama

+1

@Bathsheba:そうです、 'make_ *'関数のいずれかの「初期化されていない」形式はありません。私はそのようなものが一度提案されたと思う(make_ {shared、unique}のためのサイズの配列型を許可する提案の一部として)、提案はデフォルト初期化を使用するmake _ * _初期化されていない形式で来ました。一般に、標準ライブラリは、時にはそれが必要なものであっても、初期化されていない値を生成することを非常に困難にします。 –