1

C++ でクラス マトリックスを作成するタスクがあり、マトリックスの演算子 [] をオーバーライドする条件があるため、この "Matrix[0][0]" を持つマトリックスという名前のマトリックスがある場合は、それを最初に取得する必要があります。要素、その最初の行にあります。マトリックスを 2 次元の動的配列とテンプレート (T **matrix) で表現しました。私を手伝ってくれますか?

PS: 2 次元配列を作成するために使用しているこのメソッド:

template <class T>
T ** Matrix<T>::createMatrix(unsigned int rows, unsigned int cols)
{
    T** matrix = new T*[rows];
    for (unsigned int i = 0; i < rows; i++) {

        matrix[i] = new T[cols];

    }
    return matrix;
}
4

5 に答える 5

2

マトリックスは、マトリックスの T** 型のメンバー変数であると仮定します。

template< class T >
T* operator []( Matrix<T>& m, unsigned int row )
{
  // maybe remember rows and assert(row<rows);
  return m.matrix[ row ];
}

今、あなたは次のようなものを書くかもしれません

Matrix<T> m(50,9999);
m[42][1337]; 

行 42 の要素 1337 にアクセスします。

于 2010-12-27T11:13:35.640 に答える
1

やりたいことは、operator[] に T* を返すことです。これは、operator[] をネイティブに適用して、必要な結果を得ることができるためです。ただし、ポインターを生のままにしておくのはかなり悪い習慣であることを指摘したいと思います。

于 2010-12-27T11:10:37.997 に答える
1

これは、2 つのクラスで行うことができます。マトリックス クラスは [] をオーバーライドし、行オブジェクトを返します。行オブジェクトは [] をオーバーライドし、スカラーを返します。

于 2010-12-27T11:08:01.547 に答える
0

これを C++ でネイティブに行うことはできませんが、次の方法でマトリックスをインスタンス化することができます。

Matrix<Matrix<int>> m;

このように、最初の [ ] は、必要なアイテムを返す別のマトリックスを返します。もちろん、クラスの名前は Vector と呼ばれるよりもはるかに適切な名前であり、内部を作成する Matrix と呼ばれるラッパー クラスVector<Vector<T>>です。

于 2010-12-27T11:10:19.407 に答える
0

要件が示すように、マトリックスを作成するために使用している方法は、クラスとは何の関係もありません。シンプルな を作成しT**ていますが、クラスメソッドでそれを行っていることに違いはありません。

Tのように使用できるの行列を作成するということは、 を返すように演算子も定義されている型をmatrix[i][j]式が返さなければならないことを意味します。したがって、それを行う通常の方法は、段階的に分解することです。matrix[i][]T

  • Matrix<T> operator[] (int)を返しますMatrixRow<T>&
  • MatrixRow<T>& operator[] (int)を返しますT&

マトリックスから値を読み取るときに使用されるこれらの演算子のバージョンもありconstます (マトリックスに書き込むときは非 const バージョンが使用されます)。

したがって、少なくとも、このインターフェイスを使用してクラスを作成する必要があります。

template <typename T>
class Matrix {
    public:
        Matrix(int rows, int cols);

        const MatrixRow<T>& operator[] (int row) const;
        MatrixRow<T>& operator[] (int row);
}

PS: これは宿題の質問のように読めますが、1 つですか?

于 2010-12-27T11:15:38.633 に答える