1

C ++クラスの割り当てを開始するために、第16章を読んでいます。このセクションでは、例外処理について説明します。try / catch構造の背後にある概念は理解していますが、この本の例の1つは少し混乱しています。これがどのように機能しているかについての説明を期待しています。サンプルコードは次のとおりです。

// Includes, header guards, and namespace std...
class IntRange
{
 private:
  int intput;
  int lower;
  int upper;

 public: 
  // Exception class
  class OutOfRange { }; // This is exactly how it appears in the text.

  IntRange(int low, int high) { lower = low; upper = high; }
  int GetInput()
  {
    cin >> input;
    if (input < lower || input > upper)
      throw OutOfRange(); // <-- This is my question in particular. What is this?
    return input;
  }
};

// End header guard.

// Program entry point.

int main()
{
  IntRange range(5, 10)
  int userValue;

  cout << "Enter a value in the range 5 - 10: ";
  try
  {
    userValue = range.getInput();
    cout << "You entered " << userValue << endl;
  }
  catch (IntRange::OutOfRange) // <-- Again, what is this delcaration and how can
                               // this data type be defined when IntRange does not
                               // have a default constructor?
  {
    cout << "That value is out of range.\n";
  }

  return 0;
}

コードは教科書に記載されているとおりですが、質問が長くならないようにするために同じ行にいくつかのものを配置している点が異なります。

エラーに気付いた場合は、タイプミスである可能性が高いですが、最も重要な点が再確認されています。

4

4 に答える 4

2
 throw OutOfRange();

これにより、クラスの新しいインスタンスが作成さOutOfRangethrowます。次のようなインスタンスを作成することもできることを忘れないでください。

my_method( MyClass() );

それ以外の:

MyClass obj; 
my_method( obj );

今:

catch (IntRange::OutOfRange)

OutOfRange内部クラスまたはネストされたクラスですIntRange。こちらをご覧ください

于 2012-04-15T15:30:43.307 に答える
1
  throw OutOfRange(); // <-- This is my question in particular. What is this?

このデフォルトは、オブジェクトを作成してOutOfRangeからスローします。
クラスでメソッドを定義しなくても、コンパイラーは自動的にカップルを生成します。これらの1つがデフォルトのコンストラクターです。したがって、コンストラクターを指定しなくても、コンストラクターが存在します(コンパイラーによって生成されるメソッドの説明については、ルール3/5でグーグルを実行してください)。

catch (IntRange::OutOfRange) // <-- Again, what is this delcaration and how can
                             // this data type be defined when IntRange does not
                             // have a default constructor?

ここでは、タイプのオブジェクトをキャッチしていますIntRange::OutOfRange:のオブジェクトをキャッチしていませんIntRangeOutOfRangeクラス内でたまたま定義されているクラスをキャッチしていますIntRange(定義されている場所を除いて、他の関係はありません)。

また、注意:無効にしない限り、コンパイラはすべてのクラスのコピーコンストラクタを自動的に生成します。したがって、例外は通常、スローポイントからキャッチポイントまでコピー構築されます(少し複雑です)。したがって、例外オブジェクトはコピー可能である必要があります。

また、const参照によって例外をキャッチするのが最善であることに注意してください。

catch (IntRange::OutOfRange const& e)

例外階層の一部であるオブジェクトのスライスに関連する問題を回避します。

于 2012-04-15T15:36:20.080 に答える
0

彼らは(クラスとして)呼び出されたカスタム例外を作成し、OutOfRangeそれをスローしています。

OutOfRangeこのようにして、次のように例外を具体的にキャッチできます。

try
{
    //do something
}
catch (OutOfRange o)
{
    //you know the input was out of range
}
catch (Exception e)
{
    //something else went wrong
}
于 2012-04-15T15:31:03.047 に答える
0

あなたのOutOfRangeクラスは全体としてクラスに属してIntRangeいます-それはそのクラスの特定のオブジェクトに属していません。

オブジェクトではなく完全修飾型名を指定するだけなので、実際に具象クラスとして使用できる必要OutOfRangeはありません。IntRangeIntRange::OutOfRange

C ++では、型名はコンパイル時にのみ重要です。データ型情報(変数名やコード内のその他のあらゆる種類の情報)は、通常、コンパイラーによって完全に削除されます。データ型は、コードの記述とデバッグを支援するためにのみ存在します。

于 2012-04-15T15:31:05.893 に答える