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