我刚刚了解了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()方法,因此必须在构造函数列表而不是 init中初始化_member ,使上面的课程错误。
问题:
你如何处理这个问题?如果有的话,处理这个问题的行业标准是什么?
我看到了RAII的重要性,并且不想妥协。现在,我头脑中最干净的解决方案是使用单构造函数并使用工厂方法生成变体。但我不想急于考虑其他人的经验,否则我只会创建一个讨厌的代码。
答案 0 :(得分:3)
您必须使用initializer list:
A(int arg1, arg2) : _member(arg1, arg2) {}
在C ++ 11中,您还可以使用delegating constructors让构造函数相互调用。
顺便说一句,您应该避免在变量名称上使用前导下划线,因为它们是reserved if followed by a capital letter。