我有一个类似的类vector
,主要是一个动态大小的数组。我正在为资源有限的平台编写它,因此我需要不使用异常。
很明显,要使用运算符重载来简化此类动态分配的接口,必须在某些运算符重载函数中执行。赋值运算符 (=) 就是一个示例。
尽管如此,以一种合理的方式通知调用者一个错误的分配错误,同时仍然保持强大的错误安全性,这变得相当具有挑战性。我可能有一个类的错误属性,调用者必须在每次涉及动态分配的调用后检查它,但这似乎不是一个最佳解决方案。
编辑:
这是我目前得到的最好的想法(在上面的段落中突出显示为一个不太理想的解决方案),任何改进将不胜感激:
dyn_arr & dyn_arr::operator=(dyn_arr const & rhs) {
if (reallocate(rhs.length)) // this does not destroy data on bad alloc
error |= bad_alloc; // set flag indicating the allocate has failed
else {
size_t i;
for (i = 0; i < rhs.length; ++i) // coppy the array
arr[i] = rhs.arr[i]; // assume this wont throw an exceptions and it wont fail
}
return *this;
}
然后调用:
dyn_arr a = b;
if (a.error)
// handle it...
我还没有编译这个,所以可能有错别字,但希望你能明白。