C++ 确认初始化类构造函数中文本文件中的变量
我创建了一个类,并在构造函数中执行以下操作:C++ 确认初始化类构造函数中文本文件中的变量,c++,class,C++,Class,我创建了一个类,并在构造函数中执行以下操作: MyClass(string file) { ifstream str; str.open (file, ifstream::in); // initialize class variables based on values from file str.close(); } 但是,我如何知道在读取文件时是否有错误,以及值是否未正确初始化?上述方法是错误的吗?如果我希望从构造函数中的文件初始化变量,我还可以如何继
MyClass(string file)
{
ifstream str;
str.open (file, ifstream::in);
// initialize class variables based on values from file
str.close();
}
但是,我如何知道在读取文件时是否有错误,以及值是否未正确初始化?上述方法是错误的吗?如果我希望从构造函数中的文件初始化变量,我还可以如何继续
编辑,澄清:我要问的是这样一句话:
MyClass myclass("path/to/my/file.txt");
我怎么知道所有东西都已正确初始化?一种可能是使用异常:
...
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";
}
}
#包括
#包括
#包括
#包括
结构MyClass1{
int i;
MyClass1(常量字符*INI文件){
std::ifstream-in;
in.异常(std::ifstream::failbit);
打开(文件);
在>>i;
}
};
结构MyClass2{
int i;
bool是有效的;
MyClass2(常量字符*iniFile){
试一试{
std::ifstream-in;
in.异常(std::ifstream::failbit);
打开(文件);
在>>i;
isValid=true;
}捕获(标准::ios\U基::失败和失败){
isValid=false;
}
}
};
int main(){
试一试{
MyClass1 mc1(“somefile.txt”);
}捕获(标准::异常和失败){
std::cout您将以相同的方式检查文件返回的值,或者您总是这样做。如果您使用fread
您将检查ferror
。如果您正在执行atoi
转换,您将检查atoi
的返回值。或者您可以实现异常处理
要检查文件外部的错误代码,请通过引用传递一个int指针或int,并将其用作整个构造函数中的控件。当构造函数返回时,请检查该值。如果在构造函数执行期间的任何时候ferror
不为零,则控件应阻止在构造函数内进一步执行。 就我个人而言,我会使用一个例外,因为Rob已经回答了
另一种选择是传递对成功标志的引用
MyClass(std::string filename, bool& success)
{
success = true;
if(!str.open(filename))
{
success = false;
}
}
像这样检查是否成功
bool success;
MyClass("filename", success);
if(!success)
{
// Something failed during the class instantiation.
}
您可以使用bool
转换,以及bad()
等。但是我不能从构造函数返回值,对吗?除非我错误地理解了您的建议。您可以抛出异常或使用参数返回错误。您不能有一个读取初始化参数的类(可以是结构)并将它们传递给MyClass的构造函数?是的,可能,部分问题是是否有其他方法可以这样做,因此这是一个选项。我认为OP希望检查构造函数之外的错误。@Aesthete这个概念基本上还是一样的,但我将添加一个更新。谢谢大家,处理异常似乎是最好的选择解决我的问题,所以我会选择@Robᵩ 's