例外は「無効なインデックス [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];
}