0

以下に問題があります。マトリックスを実装します。行列全体のクラスと行列の 1 行のクラスがあります。その行列[a][b]のようなメンバーにアクセスできるように、行を作成しました。しかし、問題は、「無効なインデックス[e] [f]」のような形式でなければならない例外をスローすることです。マトリックス オーバーロード [] で try-catch を使用し、行オーバーロード [] から整数例外をスローしますが、最初のインデックスが問題なく、2 番目のインデックスが間違っている場合は解決しません。

//Matrix overload
Row& operator [] (unsigned inx) {
return *rows[inx];
}

//Row overload
double& operator [] (unsigned inx) 
{
return items[inx];
}
4

1 に答える 1

1

例外は「無効なインデックス [e][f]」のような形式である必要があります

それは思ったよりもトリッキーです!

[f]が無効な場合は、Matrix::operator[]( e )既に終了しています。そのパラメーターは使用できなくなりました。

Rowそのため、ある時点でこの情報を問題の に渡す必要があります。これが1つの方法です。

// (Member variable "int Row::index" is added...)

//Matrix overload
Row& operator [] (unsigned inx) {
  rows[inx]->setRowIndex(inx);
  return *rows[inx];
}

//Row overload
double& operator [] (unsigned inx) 
{
  // Now you can throw information about both inx and the stored row index
  return items[inx];
}

[e]が無効な場合は、Row::operator[]( f )まだ呼び出されていません。未知の値です。

つまり、 が無効な場合でも、スローする前に呼び出すことができる[e]何かを返さなければなりません。operator[]

// (Member variable "bool Row::isInvalid" is added...)

//Matrix overload
Row& operator [] (unsigned inx) {
  Row *result;
  if ( inx is invalid ) 
  {
     // Don't throw yet!
     static Row dummy;
     dummy.setInvalid();
     result = &dummy;
  }
  else
  {
    result = rows[inx];
  }
  result->setRowIndex(inx);
  return *result;
}

//Row overload
double& operator [] (unsigned inx) 
{
  // If this->isInvalid is true, the first index was bad.
  // If inx is invalid, the second index was bad.
  // Either way, we have both indices now and may throw!
  return items[inx];
}
于 2013-03-26T21:15:00.700 に答える