1
class a
{
private:
  std::shared_ptr <std::string> sptr;
public:
  void set(std::string & ref)
  {
   sptr = &ref; //error
  }
};

解決策は何ですか?参照を引数として保持する必要があり、プライベート ポインターを shared_ptr にする必要があります。

4

2 に答える 2

7

新しい生のポインターを共有ポインターに割り当て、共有ポインターに所有権を持たせるには、メンバー関数を使用しますreset

std::shared_ptr<Foo> p;

p.reset(new Foo);

共有ポインタはオブジェクトの所有権sptrを共有するため、任意の参照に対して賢明に共有所有権を持つことはほとんど不可能です。(例えばsptr.reset(&ref)、ほぼ間違いなく完全に間違っているでしょう。) 適切なことは、文字列の新しいコピーを作成することですsptr.reset(new std::string(ref))

sptr = std::make_shared<std::string>(ref);
于 2013-02-22T12:52:24.370 に答える
2

参照のアドレスを保存したい場合は、使用できます

sptr = std::shared_ptr<std::string>(&ref, [](const std::string*){});

または、新しいオブジェクトを保存する場合は、Kerrek SB バリアントを使用してください。

于 2013-02-22T12:49:41.513 に答える