1

我有一个任务是在 C++ 中编写一个类矩阵,并且有一个条件,要覆盖矩阵的运算符 [],所以如果我有一个名为 Matrix 且带有这个“Matrix[0][0]”的矩阵,我必须首先考虑它元素,在它的第一行。我已经用二维动态数组和模板(T **matrix)表示了矩阵。请问你能帮帮我吗?

PS:我用来创建二维数组的这种方法:

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

你可以用两个类来做到这一点。矩阵类覆盖 [] 并返回一个行对象。行对象覆盖 [] 并返回一个标量。

于 2010-12-27T11:08:01.547 回答
1

您要做的是在 operator[] 中返回一个 T*,因为它可以将 operator[] 本机应用于它并获得您想要的结果。但是,我想指出,让指针保持原始状态是非常糟糕的做法。

于 2010-12-27T11:10:37.997 回答
0

你不能在 C++ 中原生地做到这一点,但你可以简单地用这种方式实例化你的矩阵:

Matrix<Matrix<int>> m;

这样,第一个 [ ] 返回另一个矩阵,它将返回您想要的项目。当然,你的类的一个更好的名称是 Vector,以及一个名为 Matrix 的包装类,它创建一个内部Vector<Vector<T>>.

于 2010-12-27T11:10:19.407 回答
0

正如您的要求所述,您用于创建矩阵的方法与类没有任何关系。您正在创建一个简单T**的 ,在类方法中执行它并没有什么不同。

创建一个T可以用作 in的矩阵matrix[i][j]意味着表达式matrix[i]必须返回一个类型,在该类型上[]还定义了运算符以返回 a T。因此,通常的做法是分步分解:

  • Matrix<T> operator[] (int)返回一个MatrixRow<T>&
  • MatrixRow<T>& operator[] (int)返回一个T&

从矩阵中读取值时,也将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:这读起来像是一道作业题,是一道题吗?

于 2010-12-27T11:15:38.633 回答