带有2d阵列添加操作的模板

时间:2015-06-17 19:48:46

标签: c++ arrays templates operator-overloading

我有两个2d数组arr1这属于对象s1arr2这属于对象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上的许多示例都与我的代码类似。

2 个答案:

答案 0 :(得分:2)

要解决您的问题,您应该

  1. temp_arr课程和Matrix中删除operator +

  2. operator +中的这一行从this->temp_arr[i][j]=arr[i][j]+tmp.arr[i][j];更改为:arr[i][j] += tmp.arr[i][j];

  3. 您的实施中不需要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;
}

以上内容应该有助于说明+和+ =之间的区别,但您可以对其进行优化。