我的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())
{
}
};