3

クラスのコンストラクターでauto_ptrメンバーを初期化する正しい方法を考えています。私のクラスには、異なるタイプの2つ(またはそれ以上)のauto_ptrインスタンスがあります。そして、そのうちの1つの初期化は、最初の初期化の結果に依存します。

明確にするために、これは私がしていることです:

class C1 {
...
}

class C2 {
...
}

class Holder {
private:
  auto_ptr<C1> c1;
  auto_ptr<C2> c2;

public:
  Holder() :
    c1(new C1()),
    c2(NULL)
  {
    int x = this->c1->getGeneratedValue1();
    int y = this->c1->getGeneratedValue2();

    if (x > 0 && y > 0) {
      auto_ptr<C2> lC2(new C2(true, 10));
      this->c2 = lC2;
    } else if (x > 0) {
      auto_ptr<C2> lC2(new C2(false, 20));
      this->c2 = lC2;
    } else if (y > 0) {
      auto_ptr<C2> lC2(new C2(false, 30));
      this->c2 = lC2;
    } else {
      auto_ptr<C2> lC2(new C2(false, 0));
      this->c2 = lC2;
    }
  }
};

この例は少し繰り返しですが、2つのauto_ptrインスタンス間の依存関係を強制するためのものです。コンストラクター本体にローカルauto_ptrを作成し、初期化するとすぐに、そのマネージドインスタンスの所有権をクラスメンバーに譲渡することにしました。

それはそれを行う正しい方法ですか、それとも私はより良い/より安全なセモシングを使用する必要がありますか?

どうもありがとう。

4

1 に答える 1

6

ctor-initializer-list内の複雑な初期化ルールの場合は、ヘルパー関数を使用します。

class Holder {
private:
  std::unique_ptr<C1> c1;
  std::unique_ptr<C2> c2;

  static C2* c2_init_helper(/* const? */ C1& the_c1)
  {
    int const x = the_c1->getGeneratedValue1();
    int const y = the_c1->getGeneratedValue2();

    if (x > 0) {
      if (y > 0) return new C2(true, 10);
      return new C2(false, 20);
    }
    if (y > 0) return new C2(false, 30);
    return new C2(false, 0);
  }

public:
  Holder() :
    c1(new C1()),
    c2(c2_init_helper(*c1))
  {
  }
};

また、std::unique_ptr(C ++ 11コンパイラを使用している場合)またはboost::scoped_ptr両方が。よりも望ましいstd::auto_ptrです。 auto_ptr所有権の譲渡のコピーのセマンティクスは、問題に他ならないことがわかっています。

于 2012-06-03T16:05:15.470 に答える