重载运算符[] 我有一个任务,在C++中编写一个类矩阵,并且有一个条件来覆盖矩阵的运算符[],因此如果我有一个矩阵,这个矩阵具有这个“矩阵[0 ] [0 ] ],我必须把它的第一个元素放在它的第一行上。我用二维动态数组和模板(T**矩阵)表示了矩阵。你能帮帮我吗

重载运算符[] 我有一个任务,在C++中编写一个类矩阵,并且有一个条件来覆盖矩阵的运算符[],因此如果我有一个矩阵,这个矩阵具有这个“矩阵[0 ] [0 ] ],我必须把它的第一个元素放在它的第一行上。我用二维动态数组和模板(T**矩阵)表示了矩阵。你能帮帮我吗,c++,matrix,overloading,operator-keyword,brackets,C++,Matrix,Overloading,Operator Keyword,Brackets,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 m

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;
}
模板
T**Matrix::createMatrix(无符号整数行、无符号整数列)
{
T**矩阵=新的T*[行];
for(无符号整数i=0;i
您可以使用两个类来完成此操作。矩阵类重写[]并返回一个行对象。row对象重写[]并返回标量。

您可以使用两个类来完成此操作。矩阵类重写[]并返回一个行对象。行对象重写[]并返回标量。

您不能在C++中本地地这样做,但您可以这样简单地将矩阵实例化:

Matrix<Matrix<int>> m;
矩阵m;

这样,第一个[]将返回另一个矩阵,该矩阵将返回您想要的项。当然,对于你的类来说,一个更好的名字是向量,一个叫做矩阵的包装类,它创建了一个内部的<代码>向量 > .< /p> 你不能在C++中自然地这样做,但是你可以简单地用这种方式来构造你的矩阵:

Matrix<Matrix<int>> m;
矩阵m;

这样,第一个[]将返回另一个矩阵,该矩阵将返回您想要的项。当然,类的更好名称是Vector,一个名为Matrix的包装类创建了一个内部
向量

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

您要做的是返回一个T*in运算符[],因为它可以将运算符[]本机应用于它,并得到您想要的结果。然而,我想指出的是,让指针保持原始状态是非常糟糕的做法。

我假设matrix是matrix的T**类型的成员变量

template< class T >
T* operator []( Matrix<T>& m, unsigned int row )
{
  // maybe remember rows and assert(row<rows);
  return m.matrix[ row ];
}
模板
T*运算符[](矩阵和m,无符号整数行)
{

//可能还记得rows和assert(row我假设matrix是matrix的T**类型的成员变量

template< class T >
T* operator []( Matrix<T>& m, unsigned int row )
{
  // maybe remember rows and assert(row<rows);
  return m.matrix[ row ];
}
模板
T*运算符[](矩阵和m,无符号整数行)
{

//也许记住rows和assert(row根据您的需求状态,您用于创建矩阵的方法与类没有任何关系。您正在创建一个简单的
t**
,在类方法中这样做没有什么区别

创建一个
T
矩阵,它可以像在
matrix[i][j]
中一样使用,这意味着表达式
matrix[i]
必须返回一个类型,操作符
[]
也被定义为返回
T
。因此,通常的方法是将其分解为以下步骤:

  • 矩阵运算符[](int)
    返回一个
    矩阵行&
  • 矩阵行和运算符[](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);
}
模板
类矩阵{
公众:
矩阵(int行,int列);
常量矩阵行和运算符[](int行)常量;
矩阵行和运算符[](整数行);
}

PS:这读起来像是一个家庭作业问题,是吗?

根据您的需求状态,您用于创建矩阵的方法与类没有任何关系。您正在创建一个简单的
t**
,在类方法中这样做没有什么区别

创建一个
T
矩阵,它可以像在
matrix[i][j]
中一样使用,这意味着表达式
matrix[i]
必须返回一个类型,操作符
[]
也被定义为返回
T
。因此,通常的方法是将其分解为以下步骤:

  • 矩阵运算符[](int)
    返回一个
    矩阵行&
  • 矩阵行和运算符[](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);
}
模板
类矩阵{
公众:
矩阵(int行,int列);
常量矩阵行和运算符[](int行)常量;
矩阵行和运算符[](整数行);
}

PS:这读起来像是一个家庭作业问题,是吗?

T**
没有描述二维数组。它描述了一个数组数组,这是不一样的。
T**
没有描述二维数组。它描述了一个数组数组,这是不一样的。是的。我做了行列式法,乘法法od等等…现在我终于做了:)。是的。我做了行列式法,乘法法等等…现在我终于做了:)。谢谢!非常简单,聪明,优雅!再次感谢:)。谢谢!非常简单,聪明,优雅!再次感谢:)。