Как перегрузить +, чтобы суммировать 2 объекта, которые являются матрицей в С++?

у меня есть этот класс

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);

        ...
    }

... конструктор перемещения, оператор присваивания перемещения

    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;
    }

и основное:

...
Matrix e=b+c;
    std::cout<<"e="<<std::endl;
    e.print();

и у меня есть эта ошибка:

предупреждение: возвращена ссылка на локальную переменную 'sumMatrix' [-Wreturn-local-addr] Matrix sumMatrix(size);

Может ли кто-нибудь помочь мне с этим ??


person Ac1234    schedule 10.05.2020    source источник
comment
Вероятно, следует прочитать это: Каковы основные правила и идиомы для перегрузки операторов?, в частности, раздел об арифметических операциях.   -  person WhozCraig    schedule 11.05.2020
comment
Matrix& operator+(Matrix &m); должно быть Matrix operator+(const Matrix &m) const; Кроме того, вам может понадобиться проверить размер m. Рискованно просто предполагать, что они одного размера. Вы можете сделать размер параметром шаблона.   -  person Ted Lyngmo    schedule 11.05.2020


Ответы (1)


Возврат по значению, как и должно быть для operator+ большую часть времени:

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

Для этого потребуется конструктор копирования, обязательно добавьте его. Также обратите внимание, что вам, вероятно, следует собрать логику цикла 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;
}
person Ayxan Haqverdili    schedule 10.05.2020