我的C++类聚集了一个辅助对象,该对象可能在构造函数中引发异常,但是我自己的类一定不能引发(我自己的类由框架使用,该框架没有为构造函数引发的异常做好准备)。现在,我通过使用new创建对象来延迟辅助对象的构造,从而减轻了这种风险,这样我就可以捕获任何异常:

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

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

但是,为此滥用new有点烦人;我突然不得不无缘无故地处理整个代码的指针,除了它使我可以在构造对象的时间获得更多控制。

如果没有usign new,是否有可能达到这种效果?

最佳答案

可以使用智能指针和额外的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())
  {
  }
};

10-05 18:30