5

[][]を使用して要素にアクセスする行列クラスがあります。1つ(または両方)のインデックスが範囲外の場合、CIndexExceptionをスローする必要があります。これは、この形式の「無効なインデックス[a] [b]」でテキストを格納するクラスです。ここで、aとbは数字です。

これは、CIndexExceptionクラスの現在の実装です。

class CIndexException
{
    string text;
public:
    CIndexException (int a, int b)
    {
        ostringstream oss;
        oss << "Invalid index [";
        oss << a;
        oss << "][";
        oss << b;
        oss < "]";

        text = oss.str();
     }

     string get() const
     {
         return text;
     }
};

行列はdoubleの2D配列として表され、コンストラクターで初期化されます。

CMatrix(int r, int c)
{
    colls = c;
    rows = r;
    mat = new double * [rows];

    for (int i = 0; i < rows; i++)
    {
        mat[i] = new double [colls];
        for (int j = 0; j < colls; j++)
            mat[i][j] = 0;
    }
}

単一の要素を取得するために、次のように[]演算子をオーバーロードしました。

double * operator[] (int x) const
{
    return mat[x];
}

a [2] [3]と入力すると、この関数は最初の[]を解決し、配列へのポインターを返し、2番目の[]は通常どおり解決されます。

最初のインデックスが範囲外かどうかは簡単に確認できますが、2番目のインデックスを確認するのに問題があります。1行の行列を表す2番目のクラスMatrixRowを作成することを考えました。次に、MatrixRowsの配列があります。[] []を機能させるには、これらのクラスの両方でoperator[]がオーバーロードされます。そうすれば、両方のインデックスをチェックできますが、それらを1つの例外に「結合」する方法がわかりません。このデザインを使用しているときに、例外オブジェクトの両方のインデックスをレポートするにはどうすればよいですか?

4

2 に答える 2

3

ソリューションを使用しますMatrixRowが、行のインデックスをMatrixRowコンストラクター引数としてそれぞれに渡します。はそのMatrixRow番号を保存し、生成する例外メッセージで使用できます。

于 2013-03-24T14:44:00.590 に答える
1

operator()()の代わりに使用してくださいoperator[]()。このリンクを参照してください。このリンクに必要なものはすべて考慮されます。

于 2013-03-24T14:52:57.547 に答える