一种可能性是使用异常:
...
ifstream str;
str.exceptions(std::ifstream::failbit);
// continue as before
然后,如果你的构造函数抛出一个异常,你就知道有些东西不起作用。
另一种可能性是检测构造函数中的故障并设置一个可以由调用代码检查的状态变量。
以下是两种解决方案:
#include <iostream>
#include <exception>
#include <string>
#include <fstream>
struct MyClass1 {
int i;
MyClass1(const char * iniFile) {
std::ifstream in;
in.exceptions(std::ifstream::failbit);
in.open(iniFile);
in >> i;
}
};
struct MyClass2 {
int i;
bool isValid;
MyClass2(const char * iniFile) {
try {
std::ifstream in;
in.exceptions(std::ifstream::failbit);
in.open(iniFile);
in >> i;
isValid = true;
} catch(std::ios_base::failure &fail) {
isValid = false;
}
}
};
int main () {
try {
MyClass1 mc1("somefile.txt");
} catch(std::exception& fail) {
std::cout << "oops 1\n";
}
MyClass2 mc2("somefile.txt");
if(!mc2.isValid) {
std::cout << "oops 2\n";
}
}
假设somefile.txt
不存在,那应该打印两行“oops”。
最后,第三种可能性是确保构造函数永远不会失败。catch
在您的情况下,您可以在块中提供默认值。