RAII 多个构造函数

RAII Multiple Constructor

本文关键字:构造函数 RAII      更新时间:2023-10-16

我刚刚了解了RAII。据我了解,RAII的定义在于其名称本身。例如,(让 A 是一个类(,请考虑以下函数:

void foo(){
   A a;
   a.init();
   // Do stuff with a.
   a.destroy();
}

将 RAII 映射到上面的函数,我们得到:

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 实现的数据成员。考虑以下类:

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,这使得上面的类是错误的。

问题:

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

我看到了RAII的重要性,不想妥协。现在,我脑海中最干净的解决方案是拥有一个单一构造函数并使用工厂方法来生成变体。但我不想急于求成,首先要考虑别人的经验,否则我只会创建一个讨厌的代码。

必须使用初始值设定项列表:

A(int arg1, arg2) : _member(arg1, arg2) {}

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

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