2016-10-04 104 views
2

我想使用类成员初始值设定项的C++ 11功能来初始化类的变量。我有的类的变量是std :: string和std :: ifstream。类成员初始值设定项初始化ifstream错误检查?

class A{ 
    std::string filename = "f1.txt"; 
    std::ifstream filestream = .... 
public: 
    .... 
}; 

是否有任何方法来初始化文件流,并同时使用类成员初始化检查错误。

我想要做的是,类似下面:

class A{ 
    std::string filename = "f1.txt"; 
    std::ifstream filestream(filename); 
    if(filestream.is_open()) .... // check if file cannot be opened 
public: 
    .... 
}; 
+1

那么,没有。如果文件无法打开,你想怎么做?你可以检查在构造函数中,也许会抛出异常?但我认为这是不好的做法。 – Rakete1111

+0

@ Rakete1111多数民众赞成在我的想法以及..我只是想确保如果我做的是正确的..所以你建议我在构造函数内进行ifstream初始化? – solti

+0

是的,但我不知道我自己:/对不起。 – Rakete1111

回答

2

您可以编写和拨打内嵌拉姆达表达式执行相应的检查;这样的λ-表达有权访问数据成员:

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; 
    } 
}; 
+0

我在你的回答后给出了进一步的想法,并且想接受你的回答。我看到你的答案后的想法是,如果用户选择使用不同的文件名?在这种情况下,我可能必须使用重写类成员初始化文件名​​的mem-init构造函数。 – solti

+2

@solti是的,这肯定是覆盖默认文件名的正确方法。 – ecatmur