C++ 运算符重载c++;建议
我正在努力解决操作员过载的问题。在这种情况下,我有+运算符和我尝试过的示例,任何帮助都将不胜感激 我收到一个错误,上面写着“invaild使用'class Matrix',我不确定如何解决这个问题,如何将这两个矩阵对象添加到一起C++ 运算符重载c++;建议,c++,operators,operator-overloading,C++,Operators,Operator Overloading,我正在努力解决操作员过载的问题。在这种情况下,我有+运算符和我尝试过的示例,任何帮助都将不胜感激 我收到一个错误,上面写着“invaild使用'class Matrix',我不确定如何解决这个问题,如何将这两个矩阵对象添加到一起 Matrix Matrix::operator+(const Matrix& rhs){ return Matrix(Matrix + rhs.Matrix()); } Matrix::Matrix(int MM, int NN){
Matrix Matrix::operator+(const Matrix& rhs){
return Matrix(Matrix + rhs.Matrix());
}
Matrix::Matrix(int MM, int NN){
M = MM;
N = NN;
data = new double[M * N];
for ( int i =0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
data[i* N+j] = (double) 1000 + i*N+j;
// cout << data[i*N+j] <<"\t";
}
//cout <<"\n";
}
cout << "Matrix Constructor... (code to be implemented here!!!)\n";}
矩阵::运算符+(常量矩阵和rhs){
返回矩阵(矩阵+rhs.Matrix());
}
矩阵::矩阵(int-MM,int-NN){
M=MM;
N=NN;
数据=新的双精度[M*N];
for(int i=0;irhs是一个矩阵
像方法一样调用构造函数是非常非法的
在Matrix+rhs
中,Matrix
不是标识符
一旦你弄清楚了你的标识符,*this+rhs
相当于this->operator+(rhs)
rhs是一个矩阵
像方法一样调用构造函数是非常非法的
在Matrix+rhs
中,Matrix
不是标识符
一旦你弄清楚了你的标识符,*this+rhs
相当于this->operator+(rhs)
jpm的答案非常重要。一旦你解决了这些问题,你可以看看我的答案
从本质上讲,运算符重载与任何其他函数都没有区别
因此,在以下情况下:
Matrix Matrix::operator+(const Matrix& rhs)
你真正要做的是:将rhs添加到当前矩阵,并返回一个新矩阵。你的重载不应改变当前矩阵。请自便并使用常量:
Matrix Matrix::operator+(const Matrix& rhs) const
这样的矩阵加法应该首先检查矩阵是否具有相同的维度,以便您可以将它们添加到一起,然后循环所有“单元格”并添加它们,然后从中创建矩阵。为此,我猜您需要第二个构造函数,类似于:
Matrix::Matrix(int MM, int NN, double values[])
{
M = MM;//TODO: change to width
N = NN;//TODO: change to height
data = new double[M*N];
for(int i < 0; i < M; i++)
for(int j < 0; j < N; j++)
data[i * N+j] = values[i * N+j];
}
矩阵(int-MM,int-NN,双值[])
{
M=MM;//TODO:更改为宽度
N=NN;//TODO:更改为高度
数据=新的双精度[M*N];
for(int i<0;i
jpm的答案非常重要。一旦你解决了这些问题,你可以看看我的答案
从本质上讲,运算符重载与任何其他函数都没有区别
因此,在以下情况下:
Matrix Matrix::operator+(const Matrix& rhs)
你真正要做的是:将rhs添加到当前矩阵,并返回一个新矩阵。你的重载不应改变当前矩阵。请自便并使用常量:
Matrix Matrix::operator+(const Matrix& rhs) const
这样的矩阵加法应该首先检查矩阵是否具有相同的维度,以便您可以将它们添加到一起,然后循环所有“单元格”并添加它们,然后从中创建矩阵。为此,我猜您需要第二个构造函数,类似于:
Matrix::Matrix(int MM, int NN, double values[])
{
M = MM;//TODO: change to width
N = NN;//TODO: change to height
data = new double[M*N];
for(int i < 0; i < M; i++)
for(int j < 0; j < N; j++)
data[i * N+j] = values[i * N+j];
}
矩阵(int-MM,int-NN,双值[])
{
M=MM;//TODO:更改为宽度
N=NN;//TODO:更改为高度
数据=新的双精度[M*N];
for(int i<0;iMatrix
),其中应该有一个表达式,这正是编译器所抱怨的。您还试图调用现有对象上的构造函数,这是无效的(而且是无意义的)。您似乎还试图实现运算符+
,使其能够调用自身;如果您确实以某种方式使其编译,那么它将由于无限递归而导致堆栈溢出
也许实现加法的最简单方法是实现运算符+=
将一个矩阵添加到现有矩阵,然后实现运算符+
:
Matrix & Matrix::operator+=(Matrix const & rhs) {
// Perform addition here
for (int i = 0; i < N*M; ++i) {
data[i] += rhs.data[i];
}
return *this;
}
// This can be a non-member function
// Pass "lhs" by value to get a copy, then modify and return that.
Matrix operator+(Matrix lhs, Matrix const & lhs) {
return lhs += rhs;
}
// Or if you really want a member function for some reason
Matrix Matrix::operator+(Matix const & rhs) const {
return Matrix(*this) += rhs;
}
矩阵和矩阵::运算符+=(矩阵常数和rhs){
//在此执行加法
对于(int i=0;i
这确实要求您拥有一个正确的复制构造函数-因为您自己在构造函数中分配内存,并且可能在析构函数中取消分配内存,所以必须实现一个复制构造函数来正确分配新内存(根据),否则在复制矩阵后将得到双重删除
您正在使用一个类型名(Matrix
),其中应该有一个表达式,这正是编译器所抱怨的。您还试图调用现有对象上的构造函数,这是无效的(而且是无意义的)。您似乎还试图实现运算符+
,使其能够调用自身;如果您确实以某种方式使其编译,那么它将由于无限递归而导致堆栈溢出
也许实现加法的最简单方法是实现运算符+=
将一个矩阵添加到现有矩阵,然后实现运算符+
:
Matrix & Matrix::operator+=(Matrix const & rhs) {
// Perform addition here
for (int i = 0; i < N*M; ++i) {
data[i] += rhs.data[i];
}
return *this;
}
// This can be a non-member function
// Pass "lhs" by value to get a copy, then modify and return that.
Matrix operator+(Matrix lhs, Matrix const & lhs) {
return lhs += rhs;
}
// Or if you really want a member function for some reason
Matrix Matrix::operator+(Matix const & rhs) const {
return Matrix(*this) += rhs;
}
矩阵和矩阵::运算符+=(矩阵常数和rhs){
//在此执行加法
对于(int i=0;i