我刚知道RAII的事。据我所知,RAII的定义是它的名称itself.For实例(假设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中初始化,从而使上面的类出错。
问题:
你到底是怎么处理这个的?处理这个问题的行业标准是什么,如果有的话?
我明白莱伊的重要性,不想妥协。现在,我脑海中最清晰的解决方案是有一个单一的构造函数,并使用工厂方法来生成变体。但我不想匆忙,首先考虑到别人的经验,否则我只会创建一个讨厌的代码。
发布于 2014-12-12 02:31:58
您必须使用初始化程序列表
A(int arg1, arg2) : _member(arg1, arg2) {}在C++11中,还可以让构造函数使用委托建设者相互调用。
顺便说一句,您应该避免在变量名上使用前导下划线,因为它们是保留,如果后面跟着大写字母。
https://stackoverflow.com/questions/27435854
复制相似问题