这是使用构造函数初始化数组对象的最佳方法吗?

Is this the best way to initialize an array object using a constructor?

本文关键字:最佳 方法 对象 数组 构造函数 初始化      更新时间:2023-10-16

有人建议使用 assert,但它对用户没有帮助,因为这种数组可以在运行时创建和调整大小。所以,我认为例外更适合。虽然这是出于我自己的教育目的,但此特定部分可帮助我更好地理解初始化。我总是对如何使用构造函数最好地初始化感到困惑,因为我无法在此处返回 true/false。

现在的想法是使用例外。我想知道这是否是最好的方法以及我还应该考虑哪些其他事情。总的来说,这是使用构造函数初始化数组对象的最佳方式吗?

Array(const int size)
{  
// Validate size.
if (size <= 0)
throw std::invalid_argument("Size must be greater than zero.");
try {
m_array = new (std::nothrow)T[ob.m_size];
}
catch (std::bad_alloc &e) {
throw e;
} 
m_size = size; 
}

当前代码:

我摆脱了内部std::nothrow和内部投掷。相反,我现在只检查外部范围。我的想法是这更干净。只要用户知道要在文档中检查哪些异常,我认为这是目前的一个好方法。

try
{ 
Array<int> a(10);
con.writeLine("Size: %llu", a.getSize());
a.resize(100);
con.writeLine("Size: %llu", a.getSize());
}
catch (std::bad_alloc &e)
{
con.writeLine("Caught something terrible: %s", e.what());
}

如果您遇到不可恢复[1]错误条件,则异常是合理的。请务必记录构造函数抛出的条件。但是,比检测错误条件更好的是首先防止错误条件发生。让编译器检测错误,而不是在运行时(如果可能(检查内容。

例如,您允许传入大小的负数,但随后拒绝它。最好是首先防止负面因素被传递。将sizeint更改为unsigned是个好主意。

这就剩下零情况了。为什么创建零长度数组如此糟糕?如果你想在这种情况下抛出异常,你可以,但我建议支持零长度数组。您可能会发现它不需要特殊的逻辑,这将免费为您提供扩展功能。


[1]这当然意味着"在类内不可恢复",因为期望大多数类知道程序可以从哪些类型的错误中恢复是不合理的。