我有两个2d数组arr1
这属于对象s1
而arr2
这属于对象s2
而我想将对象存储到{{1} }}。经过大量搜索和试验s3
后,这是我的代码:
this
它仍然返回对象 #include <iostream>
#include <sstream>
using namespace std;
template <class T>
class Matrix
{
private:
T arr[2][2];
T temp_arr[2][2];
public:
Matrix();
void display();
void seter(T _var[2][2]);
Matrix operator + (Matrix tmp)
{
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
this->temp_arr[i][j]=arr[i][j]+tmp.arr[i][j];
return *this;
}
};
template<class T>
Matrix<T>::Matrix()
{
}
template<class T>
void Matrix<T>::display()
{
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
cout<<endl<<arr[i][j];
}
template<class T>
void Matrix<T>::seter(T _var[2][2])
{
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
arr[i][j]=_var[i][j];
}
int main()
{
double arr1[2][2];
double arr2[2][2];
double x=2.5,y=3.5;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
arr1[i][j]=x++;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
arr2[i][j]=y++;
Matrix<double> s1;
Matrix<double> s2;
Matrix<double> s3;
s1.seter(arr1);
s2.seter(arr2);
s3=s1+s2;
s1.display();
cout<<endl;
s2.display();
cout<<endl;
s3.display();
return 0;
}
的数组,我无法理解为什么因为Web上的许多示例都与我的代码类似。
答案 0 :(得分:2)
要解决您的问题,您应该
从temp_arr
课程和Matrix
中删除operator +
。
将operator +
中的这一行从this->temp_arr[i][j]=arr[i][j]+tmp.arr[i][j];
更改为:arr[i][j] += tmp.arr[i][j];
您的实施中不需要temp_arr
。
以下是使用上述更改的实时示例:http://ideone.com/lMF3kT
另一个问题是您在调用Matrix
时正在更改原始operator +
对象。这是违反直觉的,因为+
不应该更改原始对象,而是应该返回一个新对象。
要解决此问题,您可以将代码(一旦修复)移出operator +
并将其移至operator +=
。
Matrix& operator += (const Matrix& tmp)
{
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
arr[i][j] += tmp.arr[i][j];
return *this;
}
请注意,我们将原始对象作为参考返回。现在,我们可以根据operator +
:
operator +=
Matrix operator + (const Matrix& tmp)
{
Matrix temp(*this);
return temp += tmp;
}
编辑:
制作参数const引用。
答案 1 :(得分:1)
您不应该将temp_arr
作为类成员,而是在const运算符中使用临时实例并将其返回到堆栈
此外,由于人们应该能够添加const
个实例,请将operator +
const
成员函数设为:
Matrix operator + (const Matrix& tmp) const
{
Matrix ret(*this);
ret+=tmp;
return ret;
}
以上内容应该有助于说明+和+ =之间的区别,但您可以对其进行优化。