如何使用资源获取实现Builder模式是初始化?

时间:2014-03-27 10:16:51

标签: c++ builder raii

我有一个从构建器创建的对象。 做了一些事后我必须删除它。 但是,如果抛出异常,则无法访问代码

{
  cClass* cc = MyBuilder.build();
  // do something usefull, exception may be thrown
  delete cc;
}

由于C ++中没有像Java中那样的finally关键字,因此资源获取是初始化是可行的方法。正确?

那么,如何使用资源获取初始化来实现Builder模式?

1 个答案:

答案 0 :(得分:3)

MyBuilder应返回unique_ptrshared_ptr,具体取决于是否要保留对返回指针本身的引用。这不仅可以提供所需的异常安全性,而且如果由于某种原因构建器必须销毁它后来创建的对象,它也会有所帮助:

class MyBuilder {
  std::shared_ptr<MyClass> build() {
    return std::shared_ptr<MyClass>{new MyClass(), [this](MyClass* ptr){ destroy(ptr); } };
  }

  void destroy(MyClass* ptr) {
    /* do something with ptr */
    delete ptr;
  }
};

//later:

{
  auto ptr = myBuilder.build();
} //automatically calls myBuilder.destroy(ptr)