1

条件に基づいて boost::shared_ptr を初期化する必要があります。以下のサンプル コードは、私が探しているシナリオを示しています。

class A{};
class B:public A{};
class C:public A();

void some_func(int opt)
{
   boost::shared_ptr<A> abstract_ptr;
   if(opt==RELEVENT_TO_B)
   {
      abstract_ptr(new B);
   }
   else
   {
      abstract_ptr(new C);
   }
}

上記のコードサンプルは間違っています。boost::shared_ptr<A> Abstract_ptrの 2 行目でsome_func()は、引数を取らない shared_ptr コンストラクターを使用して shared_ptr オブジェクトを作成します。代入演算子が定義されておらず、初期化後に生のポインターを受け取る shared_ptr がないため、if-else 内のコードが間違っています。

私の質問は、boost::shared_ptr を使用してこれ (some_func に示されている条件付き初期化) を適度に達成する方法です。

4

3 に答える 3

3

生のポインタを共有ポインタに置くために使用.reset()できます。

   boost::shared_ptr<A> abstract_ptr;
   if (opt == RELEVENT_TO_B)
      abstract_ptr.reset(new B);
   else
      abstract_ptr.reset(new C);

共有ptrを直接割り当てることもできます:

   boost::shared_ptr<A> abstract_ptr;
   if (opt == RELEVENT_TO_B)
      abstract_ptr = boost::make_shared<B>();
   else
      abstract_ptr = boost::make_shared<C>();
于 2012-10-21T11:01:53.340 に答える
1

まず、既に行っていること、つまり共有ポインタの再割り当てを行うことは問題ありません。

boost::shared_ptr<A> abstract_ptr;
if(opt==RELEVENT_TO_B)
   abstract_ptr = boost::make_shared<B>();
else
   abstract_ptr = boost::make_shared<C>();

上記の最初の行の効果は、null ポインターが共有ポインターにラップされることであり、再代入の効果は、現在ラップされているオブジェクトの参照カウントが減少し、新しく割り当てられたオブジェクトの参照カウントが増加することです。 . 問題ありません。

または、すべてを 1 行にまとめたい場合は、条件演算子を使用できます。

boost::shared_ptr<A> abstract_ptr = (opt==RELEVANT_TO_B ? boost::make_shared<B>() : boost::make_shared<C>());
于 2012-10-21T11:04:20.903 に答える
0

これはうまくいきませんか?

void some_func(int opt)
{
   boost::shared_ptr<A> abstract_ptr((opt == RELEVENT_TO_B) ? (A*) new B ? (A*) new C));
}
于 2012-10-21T11:05:38.060 に答える