用error初始化构造函数中的成员
Initialize members in constructor with error
我是一个c++新手,所以请原谅我。
是否有一个最佳实践初始化成员在构造函数中,当没有有效的值分配给成员?
例如:
device_123::device_123(data_struct_t * initData)
{
if(initData==NULL)
{
print_error(0);
// what to initialize foo/bar to?
}
else
{
foo = initData->foo;
bar = initData->bar;
}
}
在"initData==NULL"的情况下,是否有一个干净的方法来初始化foo &栏说:"嘿,我们实际上没有得到分配给我们的正确值"。
我知道这个问题可能听起来具体到我的代码实现应该如何解释foo/bar,但我只是想知道是否有一个最佳实践。
如果您想确保您的类构造函数只接受有效的指针,请更改签名以使用引用:
class defice_123 {
public:
defice_123(data_struct_t& initData) : foo(initData.foo), boo(initData.boo) {
}
...
};
如上所述,您可以在构造函数中强制执行签名。
也有其他选择:
- 构造函数出错时,抛出异常
- 在构造函数中做最少的事情(零变量),并将复杂的东西移到初始化函数中,您可以灵活地在失败时返回更多细节。
我们在这里讨论最佳实践,所以我采取强硬路线。总是有例外,但例外就是例外,而不是最佳实践。
最佳实践表明,在获得初始化对象所需的信息之前,不要分配对象。这是作为资源分配初始化或RAII的一部分捆绑在一起的。
在RAII中,当你构造一个对象时,它必须从构造函数中得到完整的、有效的和可以使用的。如果一个对象不能被完全和正确地初始化,它应该被丢弃、丢弃、抹掉或以其他方式处理,这样绝对不会混淆对象的状态。对象要么是可以使用的,要么是不存在的
如果您没有足够的信息使对象有效,则您过早地实例化了对象。如果在构造对象时,输入导致对象不能有效,则进行清理,抛出异常,并将对象返回到它来的地方。创建器没有得到无效对象。。
RAII使您不必在使用对象之前不断检查object.isvalid()
之类的内容。你有一个物体,它是一个好物体。如果对象包装了一个资源,那么该资源在您需要时是可用的和可访问的。您不必担心诸如打开不存在的文件之类的小错误。如果您有一个对象,则该文件是打开的,可以访问。
作为一个额外的好处,如果正确观察RAII,可以保证在对象超出作用域时释放资源。静态分配(通常是堆栈)和智能指针是你的朋友。
这需要相当成熟的异常使用,因为您不会获得返回的错误代码,因此抛出的异常需要对错误类型有意义,或者包含信息丰富的what
字符串,并得到有效处理。如果性能很关键,可能需要在构造异常处理程序之前捕获由例程事件引起的故障,以避免在异常处理程序中浪费时间。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 继承:构造函数,初始化C++11中基类的类C数组成员
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如果基类包含双指针成员,则派生类的构造函数
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- constexpr构造函数需要常量成员函数时出现问题
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 在成员构造函数之后调用基类构造函数
- C++:如何在对象构造过程中调用初始值设定项列表之外的成员构造函数
- 用作成员构造函数参数的函数的求值顺序
- 从成员构造函数(Brace Initializer vs Initializer列表)抛出异常
- 不正确的成员构造函数定义
- 我可以基于模板参数将某个值传递给成员构造函数吗
- 在类定义中调用成员构造函数
- 使用已删除的副本构造函数和初始值设定项列表重载调用类定义中的成员构造函数
- 正在从成员构造函数调用虚拟函数
- c++初始化类成员构造函数
- c++模板限制成员构造函数