c++ - RAII 和工厂设计模式?

标签 c++ c++11 factory c++17 copy-elision

假设我有 Foo 类:

struct Resource {
  void block();
  void unblock();
};
struct Foo {
   static Foo create() {
      Resource resource;
      resource.block();
      return Foo{resource};
    }
   ~Foo() { resource.unblock(); }
   void f() {}
private:
   Resource resource;
   Foo(Resource resource): resource(resource) {}
};

我说得对吗,不能保证 ~Foo 只会在这样的 block 中被调用一次?

{
   Foo foo = Foo::create();
   foo.f();
}

如果不能保证,如果使用 c++11 和移动语义是否有可能以某种方式修复?例如不在移动的 foo 中调用 unblock_resource,但我不确定是否保证使用移动构造函数/operator= 从 Foo::create 返回?

最佳答案

复制省略对您没有帮助,因为它是一种优化,可能应用也可能不应用。

移动语义确实有帮助,您可以在局部变量的函数返回中得到有保证的移动。但这意味着必须编写移动构造函数,并且必须修改析构函数以便它不会解锁从中移动的对象的资源。

关于c++ - RAII 和工厂设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47723473/

相关文章:

c++ - 此应用程序启动失败,因为它找不到或加载 Qt 平台插件 "xcb"

c++ - 拆分句子并放置在 vector 中

c++ - 未定义引用 'OpenNIProcessor::run()'

c++ - 如何实现自动插入隐含占位符的 easy_bind()?

c++ - 从作为模板参数传递的 const 类型继承

constructor - Dart Factory构造函数-与 “const”构造函数有何不同

c++ - 有没有办法从此 sql 语句和逻辑中删除 select count(*)

c++ - 动态规划 - 计算地铁系统中的路径

javascript - 揭示模式用例

c# - 工厂模式在工厂类中实例化类