11

std::make_shared を使用して「this」をコンストラクターに渡そうとしています

例:

// headers
class A 
{
public:
   std::shared_ptr<B> createB();
}


class B 
{
private:
   std::shared_ptr<A> a;

public:
   B(std::shared_ptr<A>);
}


// source
std::shared_ptr<B> A::createB()
{
   auto b = std::make_shared<B>(this); // Compiler error (VS11 Beta)
   auto b = std::make_shared<B>(std::shared_ptr<A>(this)); // No compiler error, but doenst work
   return b;
}

ただし、これは正しく機能しません。これを引数として適切に渡す方法はありますか?

4

1 に答える 1

13

ここでおそらく欲しいのはshared_from_this.

// headers
class A : std::enable_shared_from_this< A >
{
public:
   std::shared_ptr<B> createB();
}


class B 
{
private:
   std::shared_ptr<A> a;

public:
   B(std::shared_ptr<A>);
}


// source
std::shared_ptr<B> A::createB()
{
   return std::make_shared<B>( shared_from_this() );
}

David Rodriguez からのコメントを含めるように更新します。

によってまだ管理されていないオブジェクトに対して決してshared_from_this()呼び出されるべきではないことに注意してください。これは有効です:shared_ptr

shared_ptr<A> a( new A );
a->createB();

delete以下は未定義の動作につながります( onを呼び出そうとしますa):

A a;
a.createB();
于 2012-05-10T12:44:04.910 に答える