【发布时间】:2017-04-06 11:39:34
【问题描述】:
考虑以下类:
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;
}
困难在于对象必须在try 块内构造,因为范围检查:
int main()
{
try {
MyClass mc(1000);
}
catch (std::invalid_argument &ia)
{
std::cout << ia.what();
}
return 0;
}
问题是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;
}
还有其他/更好的解决方案吗?
【问题讨论】:
-
我很确定你的意思是
checkNum和checkPin是同一个名字。请在 SO 问题中发布真实代码。至少有一个答案似乎被此误导了。
标签: c++ exception constructor try-catch constants