3

私のC++クラスは、コンストラクターで例外をスローする可能性のあるヘルパーオブジェクトを集約しますが、自分のクラスはスローしてはなりません(自分のクラスは、コンストラクターによってスローされる例外に備えていないフレームワークによって使用されます)。今のところ、new例外をキャッチできるように、を使用してオブジェクトを作成することでヘルパーオブジェクトの構築を遅らせることで、このリスクを軽減しています。

struct HelperObject {
  HelperObject() {
    throw 0;
  }
}

struct MyObject {
  HelperObject *o;
  MyObject() : o( 0 ) {
    try {
      o = new HelperObject;
    } catch ( ... ) {
      // ...
    }
  }
};

ただし、これを悪用するのは少し面倒newです。オブジェクトが構築される時間をより細かく制御できることを除いて、正当な理由もなく、突然コード全体のポインターを処理する必要があります。

使用せずにこの効果に何かを達成することは可能newですか?

4

2 に答える 2

4

スマートポインタと追加のMakeHelperObject関数を使用して、HelperObjectドメイン内で例外が実行されるようにすることができます。これにより、MyObjectコードがクリーンになりますが、HelperObjectの構築中に例外を処理する必要があります。

struct HelperObject {
  HelperObject() {
    throw 0;
  }

   static HelperObject* MakeHelperObject()
   {
     try
     {
       HelperObject* p = new HelperObject();
       return p; 
     }
     catch(const SomeException& e)
     {
      // deal with e
    }
    return NULL;
  }
};


struct MyObject {
  std::unique_ptr<HelperObject> o;
  MyObject() : o(HelperObject::MakeHelperObject())
  {
  }
};
于 2013-01-03T11:19:39.680 に答える
2

いいえ、例外を抑制する必要があり、それはtryブロックでのみ実行でき、関数tryブロックでは例外を抑制できません。フレームワークが、現在大きな穴のあるオブジェクトを正常に構築したと考えた場合、フレームワークがどのように動作するのかという疑問を投げかけます。

スコープポインタを使用して、を自動的に割り当て解除することを検討する必要がありますHelperObject。それはより弾力性のあるコードになります。

于 2013-01-03T11:18:26.963 に答える