c++ - 如何重载+以求和2个矩阵对象?

Ac1*_*234 2 c++ unique-ptr

我有这门课

class Matrix
{
    int size;

    std::unique_ptr<std::unique_ptr<int[]>[]>  val;

public:

    Matrix(int size1)
    {
        size=size1;
        val=std::make_unique< std::unique_ptr<int[]>[] >(size);

        ...
    }
Run Code Online (Sandbox Code Playgroud)

...移动构造函数,移动赋值运算符

    Matrix& operator+(Matrix &m)
    {
        Matrix sumMatrix(size);
        for ( int i = 0; i < size; ++i)
        {
            for (int j = 0; j < size; ++j){
                sumMatrix.val[i][j]=this->val[i][j]+m.val[i][j];
            }

        }
        return sumMatrix;
    }
Run Code Online (Sandbox Code Playgroud)

和主要:

...
Matrix e=b+c;
    std::cout<<"e="<<std::endl;
    e.print();
Run Code Online (Sandbox Code Playgroud)

我有这个错误:

警告:对局部变量“sumMatrix”的引用返回 [-Wreturn-local-addr] 矩阵 sumMatrix(size);

有人可以帮我解决这个问题吗??

Ayx*_*xan 5

按值返回,operator+大多数情况下您应该这样做:

//   vvv--Removed &     vvvvv-----vvvvv--Const is more appropriate here
Matrix operator+(Matrix const &m) const { ... }
Run Code Online (Sandbox Code Playgroud)

这将需要一个复制构造函数,确保添加它。另请注意,您可能应该将 for 循环逻辑收集到一个operator+=并operator+显着简化,同时为最终用户提供更多功能:

Matrix& operator+=(Matrix const& m) {
  for (int i = 0; i < size; ++i) {
    for (int j = 0; j < size; ++j) {
      //vvv--No need for this-> in C++    
      val[i][j] += m.val[i][j];
    }
  }
  return *this;
}

Matrix operator+(Matrix const& m) const {
  Matrix sumMatrix{m}; // requires a copy constructor.
  sumMatrix += *this;
  return sumMatrix;
}
Run Code Online (Sandbox Code Playgroud)