C++ 类成员初始值设定项是否使用错误检查初始化ifstream?
我试图使用C++11类成员初始值设定项的特性来初始化类的变量。我拥有的类的变量是std::string和std::ifstreamC++ 类成员初始值设定项是否使用错误检查初始化ifstream?,c++,c++11,C++,C++11,我试图使用C++11类成员初始值设定项的特性来初始化类的变量。我拥有的类的变量是std::string和std::ifstream class A{ std::string filename = "f1.txt"; std::ifstream filestream = .... public: .... }; 是否有任何方法可以初始化filestream,同时使用类成员初始化检查错误 我想做的是,类似于下面的事情: class A{ std::string fi
class A{
std::string filename = "f1.txt";
std::ifstream filestream = ....
public:
....
};
是否有任何方法可以初始化filestream,同时使用类成员初始化检查错误
我想做的是,类似于下面的事情:
class A{
std::string filename = "f1.txt";
std::ifstream filestream(filename);
if(filestream.is_open()) .... // check if file cannot be opened
public:
....
};
您可以编写和调用内联lambda表达式来执行适当的检查;这样的lambda表达式可以访问数据成员:
class A {
std::string filename = "f1.txt";
std::ifstream filestream = [&] {
std::ifstream fs{filename};
if (!fs)
throw std::runtime_error("failed to open ifstream");
return fs;
}();
};
将逻辑分离为一个可重用的辅助函数,并将filename
作为参数,例如静态成员函数:
class A {
std::string filename = "f1.txt";
std::ifstream filestream = openChecked(filename);
static std::ifstream openChecked(std::string const& filename)
{
std::ifstream fs{filename};
if (!fs)
throw std::runtime_error("failed to open ifstream");
return fs;
}
};
不,如果文件无法打开,你想怎么办?您可以在构造函数中检查它,并可能引发异常?但我认为这是一种不好的做法。@Rakete1111我也这么想。。我只是想确定我是否做对了。。所以你建议我在构造函数中进行ifstream初始化?是的,但我自己也不知道:/抱歉。这是一个糟糕的做法。正如Rakete1111所说的,检查并初始化构造函数中的成员变量。在您的回答之后,我进一步考虑了这一点,并愿意接受您的回答。我看到你们的答案后的想法是,若用户选择使用不同的文件名怎么办?在这种情况下,我可能必须使用mem init构造函数来覆盖类成员初始化的文件名。@solti是的,这肯定是覆盖默认文件名的正确方法。