这个条件在构造函数中是正确的还是有更好的方法来做到这一点?
class Foo {
public: Foo(int y) {
if (y < 0 || y > 99)
cout << "Error! Invalid input" << endl;
else
x = y;
}
private: int x;
};
Run Code Online (Sandbox Code Playgroud)
C++中用于在构造时验证对象的一般模式(即防止创建无效对象)是在构造函数中抛出异常.这样你可以保证,如果你有一个类型为Foo的对象,它将被正确初始化或根本不被创建.
所以你会做的事情是这样的:
class Foo{
public: Foo(int y) {
if (y < 0 || y > 99)
throw std::invalid_argument("y out of range");
x = y;
}
};
Run Code Online (Sandbox Code Playgroud)
在实例化时,你可以像这样捕获异常:
try
{
Foo f(100);
// do stuff with f
}
catch(std::invalid_argument& e)
{
std::cout << "Construction of Foo failed" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如果你没有抓住它,它会冒出来,你可以在更高的层次上捕获它或者根本不捕获它,这将导致中止并退出应用程序.一般情况下,异常应该在一个明显如何正确应对特殊情况的地方捕获(比如在最简单的情况下向用户显示错误并继续执行).