其他分享
首页 > 其他分享> > c – RAII和工厂设计模式?

c – RAII和工厂设计模式?

作者:互联网

假设我有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在这样的块中只被调用一次吗?

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

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

解决方法:

复制elision对您没有帮助,因为它是一种优化,可能会也可能不会应用.

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

标签:copy-elision,c,c11,factory,c17
来源: https://codeday.me/bug/20190724/1522128.html