RAII 多个构造函数
RAII Multiple Constructor
我刚刚了解了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 中,还可以让构造函数使用委派构造函数相互调用。
顺便说一下,您应该避免在变量名称上使用前导下划线,因为如果后跟大写字母,它们将被保留。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 避免在构造函数中分配或保持简单性(和 RAII?
- 如果RAII构造函数抛出呢
- C++:使用RAII解析构造函数-初始化器列表依赖项
- 如何处理 RAII 的构造函数失败
- RAII 在两个构造函数之间进行选择的方式
- RAII 多个构造函数
- 构造函数中的 RAII 和异常
- 在具有移动语义的RAII类中,默认构造函数应该做什么
- 当构造函数抛出异常时,RAII是如何工作的
- 通过构造函数和析构函数实现 RAII 是否被认为是糟糕的"现代C++"?
- 当混合默认构造函数和非默认构造函数时,RAII是如何工作的
- 捕获构造函数异常的RAII方法