建议使用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());
}
答案 0 :(得分:1)
如果您有不可恢复的 [1] 错误条件,则可以使用异常。确保记录构造函数抛出的条件。但是,比检测错误情况更好的是首先防止发生错误情况。让编译器检测错误,而不是在运行时检查(如果可能)。
例如,您允许传入一个负数作为该大小,然后拒绝它。更好的办法是首先防止负面因素通过。将size
从int
更改为unsigned
是个好主意。
剩下零的情况。为什么创建零长度数组这么糟糕?如果您想在这种情况下引发异常,可以,但是我建议您支持零长度数组。您可能会发现它不需要特殊的逻辑,这将免费为您提供扩展功能。
[1] 这当然意味着“在类中不可恢复”,因为指望大多数类知道程序可以从中恢复什么样的错误是不合理的。