我在这里简化我的问题,因为我有相当大的代码库,而且我无法制作mcve。
我有一个可能成功或不可能成功构造的对象。如果不是,ObjectUnsupported
则在其构造函数中引发种类异常
class Object {
public:
Object() {
read_data1();
..
if(unsupported_kind == true)
throw ObjectUnsupported();
..
read_data2();
}
std::vector<char> data1;
std::vector<char> data2;
};
data1
是永远读,而data2
仅适用于支持的对象。
现在,我正在尝试使用智能指针在其他地方构造对象
std::unique_ptr<Object> obj;
try {
obj = std::make_unique<Object>();
} catch(ObjectUnsupported& ex) {
object_is_unsupported = true;
}
if(object_is_unsupported) {
if(checkIfDataIsNeeded(obj->data1) == false)
return; // We didn't need it anyway
else
throw RuntimeError(); // Data was needed! Abort!
}
data1
总是被读取,而data2
不是,但这里的重点是:我可能需要它,data2
或者根本不需要该对象。
上面的代码不起作用,因为obj
调用了智能指针的析构函数,因此使我的后续代码出错。
我如何实现我的目标?
从构造函数中引发异常不会使您留下一半构造的对象。通过设计,该对象不存在。到异常点为止的所有构造成员都将被销毁。
此处的解决方案是让您的对象支持一个标志,该标志指示其具有多少数据。
例如:
class Object {
public:
Object() {
read_data1();
..
if(!unsupported_kind)
{
read_data2();
_has_supported_data = true;
}
}
bool has_supported_data() const {
return _has_supported_data;
}
std::vector<char> data1;
std::vector<char> data2;
private:
bool _has_supported_data = false;
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句