And*_*Pro 1 c++ constructor const exception try-catch
考虑以下课程:
class MyClass
{
private:
const unsigned int num;//num identifies the object. needs to be const
unsigned int checkNum(unsigned int);// verifies that num has a valid value
public:
MyClass(unsigned int n): num(checkNum(n)) {}
};
unsigned int MyClass:checkNum(unsigned int n)
{
if (some_condition)
throw std::invalid_argument("Invalid number");
return n;
}
Run Code Online (Sandbox Code Playgroud)
难点在于,try由于范围检查,必须在块内构造对象:
int main()
{
try {
MyClass mc(1000);
}
catch (std::invalid_argument &ia)
{
std::cout << ia.what();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是mc在try块之外是不可用的.
可能的解决方案:
try在使用的整个范围内扩展块mc.在许多情况下不实用.
不要在构造函数中抛出异常,但之后抛出它会为时已晚.
我能想到的唯一可接受的解决方案是使用智能指针将声明带到try块之外:
int main()
{
std::unique_ptr<MyClass> my_class_ptr;
try {
my_class_ptr = std::make_unique<MyClass>(1000);
}
catch (std::invalid_argument &ia)
{
std::cout << ia.what();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
还有其他/更好的解决方案吗?