首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RAII多重构造器

RAII多重构造器
EN

Stack Overflow用户
提问于 2014-12-12 02:21:45
回答 1查看 101关注 0票数 0

我刚知道RAII的事。据我所知,RAII的定义是它的名称itself.For实例(假设A是一个类),请考虑以下函数:

代码语言:javascript
复制
void foo(){
   A a;
   a.init();
   // Do stuff with a.
   a.destroy();
}

将RAII应用到上面的函数中,我们得到:

代码语言:javascript
复制
void foo(){
  // Initializing the resource completely in a consttructor.
  A a;
  // Do stuff with a.
  // When out of scope, the destructor should be called.
}

因此,RAII是一个很好的软件开发工作流,因为它利用了构造函数/析构函数调用来初始化和释放资源,从而减少了开发人员的错误。

问题:

假设我有一个具有多个构造函数的类,并且包含没有no-arg构造函数以强制RAII实现的数据成员。请考虑以下课程:

代码语言:javascript
复制
class A{
public:
  A(int arg1){
    int(arg1, GLOBAL_CONSTANT);
  }

  A(int arg1, arg2){
    init(arg1, arg2);
  }

  void init(int arg1, int arg2){
    _member = B(arg1, arg2);
  }

private:
  B _member;  // No-arg constructor member.
};

由于B还实现了RAII方法,所以它没有一个no-arg构造函数来强迫用户以后不使用init()方法,因此_member必须在构造函数列表中初始化,而不是在init中初始化,从而使上面的类出错。

问题:

你到底是怎么处理这个的?处理这个问题的行业标准是什么,如果有的话?

我明白莱伊的重要性,不想妥协。现在,我脑海中最清晰的解决方案是有一个单一的构造函数,并使用工厂方法来生成变体。但我不想匆忙,首先考虑到别人的经验,否则我只会创建一个讨厌的代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-12 02:31:58

您必须使用初始化程序列表

代码语言:javascript
复制
A(int arg1, arg2) : _member(arg1, arg2) {}

在C++11中,还可以让构造函数使用委托建设者相互调用。

顺便说一句,您应该避免在变量名上使用前导下划线,因为它们是保留,如果后面跟着大写字母

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27435854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档