用error初始化构造函数中的成员

Initialize members in constructor with error

本文关键字:成员 构造函数 error 初始化      更新时间:2023-10-16

我是一个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) {
  }
...
};

如上所述,您可以在构造函数中强制执行签名。

也有其他选择:

  1. 构造函数出错时,抛出异常
  2. 在构造函数中做最少的事情(零变量),并将复杂的东西移到初始化函数中,您可以灵活地在失败时返回更多细节。

我们在这里讨论最佳实践,所以我采取强硬路线。总是有例外,但例外就是例外,而不是最佳实践。

最佳实践表明,在获得初始化对象所需的信息之前,不要分配对象。这是作为资源分配初始化或RAII的一部分捆绑在一起的。

在RAII中,当你构造一个对象时,它必须从构造函数中得到完整的、有效的和可以使用的。如果一个对象不能被完全和正确地初始化,它应该被丢弃、丢弃、抹掉或以其他方式处理,这样绝对不会混淆对象的状态。对象要么是可以使用的,要么是不存在的

如果您没有足够的信息使对象有效,则您过早地实例化了对象。如果在构造对象时,输入导致对象不能有效,则进行清理,抛出异常,并将对象返回到它来的地方。创建器没有得到无效对象。。

RAII使您不必在使用对象之前不断检查object.isvalid()之类的内容。你有一个物体,它是一个好物体。如果对象包装了一个资源,那么该资源在您需要时是可用的和可访问的。您不必担心诸如打开不存在的文件之类的小错误。如果您有一个对象,则该文件是打开的,可以访问。

作为一个额外的好处,如果正确观察RAII,可以保证在对象超出作用域时释放资源。静态分配(通常是堆栈)和智能指针是你的朋友。

这需要相当成熟的异常使用,因为您不会获得返回的错误代码,因此抛出的异常需要对错误类型有意义,或者包含信息丰富的what字符串,并得到有效处理。如果性能很关键,可能需要在构造异常处理程序之前捕获由例程事件引起的故障,以避免在异常处理程序中浪费时间。