C++ 类成员初始值设定项是否使用错误检查初始化ifstream?

C++ 类成员初始值设定项是否使用错误检查初始化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

我试图使用C++11类成员初始值设定项的特性来初始化类的变量。我拥有的类的变量是std::string和std::ifstream

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是的,这肯定是覆盖默认文件名的正确方法。