这是使用构造函数初始化数组对象的最佳方法吗?
Is this the best way to initialize an array object using a constructor?
有人建议使用 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]错误条件,则异常是合理的。请务必记录构造函数抛出的条件。但是,比检测错误条件更好的是首先防止错误条件发生。让编译器检测错误,而不是在运行时(如果可能(检查内容。
例如,您允许传入大小的负数,但随后拒绝它。最好是首先防止负面因素被传递。将size
从int
更改为unsigned
是个好主意。
这就剩下零情况了。为什么创建零长度数组如此糟糕?如果你想在这种情况下抛出异常,你可以,但我建议支持零长度数组。您可能会发现它不需要特殊的逻辑,这将免费为您提供扩展功能。
[1]这当然意味着"在类内不可恢复",因为期望大多数类知道程序可以从哪些类型的错误中恢复是不合理的。
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?