3

クラスを作成し、コンストラクターで次のようなことを行います。

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");

すべてが正しく初期化されたことをどのように確認できますか?

4

3 に答える 3

3

1 つの可能性は、例外を使用することです。

...
ifstream str;
str.exceptions(std::ifstream::failbit);
// continue as before

次に、コンストラクターが例外をスローした場合、何かが機能していないことがわかります。

もう 1 つの可能性は、コンストラクターでエラーを検出し、呼び出し元のコードで調べることができる状態変数を設定することです。

両方のソリューションを次に示します。

#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";
  }
}

somefile.txtそれが存在しないと仮定すると、 2行の「oops」が出力されるはずです。

最後に、3 つ目の可能性は、コンストラクターが決して失敗しないようにすることです。あなたの場合、catchブロックにデフォルト値を指定できます。

于 2012-11-29T22:20:57.240 に答える
1

いつもと同じ方法で、ファイルから返された値を確認します。使用している場合はfread、にチェックを入れてくださいferroratoi変換を行っている場合は、 の戻り値を確認しますatoi。それ、または例外処理を実装できます。

ファイルの外部でエラー コードを確認するには、int ポインターまたは int を参照渡しし、それをコンストラクター全体のコントロールとして使用します。コンストラクターが戻ったら、その値を確認してください。コンストラクターの実行中の任意の時点でferrorゼロでない場合、コントロールはコンストラクター内でのそれ以上の実行を防止する必要があります。

于 2012-11-29T22:22:18.143 に答える
1

個人的には、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.
}
于 2012-11-29T22:25:56.727 に答える