1 つの可能性は、例外を使用することです。
...
ifstream str;
str.exceptions(std::ifstream::failbit);
// continue as before
次に、コンストラクターが例外をスローした場合、何かが機能していないことがわかります。
もう 1 つの可能性は、コンストラクターでエラーを検出し、呼び出し元のコードで調べることができる状態変数を設定することです。
両方のソリューションを次に示します。
#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
それが存在しないと仮定すると、 2行の「oops」が出力されるはずです。
最後に、3 つ目の可能性は、コンストラクターが決して失敗しないようにすることです。あなたの場合、catch
ブロックにデフォルト値を指定できます。