Рабочий способ реализации этого operator=
будет следующим:
Matrix& Matrix::operator=(const Matrix &m)
{
this->rows = m.rows;
this->cols = m.cols;
this->data = m.data;
return *this;
}
Я не подойду к алгоритму, необходимому для operator+
, но окружающий механизм также удивительно прост :
Matrix operator+(const Matrix &a, const Matrix &b) //sums two matrices
{
Matrix result(<num of rows>, <num of cols>, 0);
// do things with result here, using your algorithm, a, and b
// e.g. result.data[?] = a.data[?] ? b.data[?]
return result;
}
Чтобы сделать это проще, поскольку ваши данные одномерны (хорошо! Это эффективно!), Вы можете захотеть реализовать средство доступа, которое принимает x и y размеры и возвращает индекс в data
. Например:
int& Matrix::val(const int x, const int y)
{
assert(x < cols);
assert(y < rows);
return data[x + y*cols];
}
Результат этого может быть как прочитан, так и записан, например:
result.val(x1, y1) = a.val(x2, y2) + b.val(x3, y3);
Где эти координаты и +
- просто вещи, которые я сделал и должен исходить из вашего алгоритма.
Если вы также хотите, чтобы operator+=
влиял на существующую матрицу, то:
Matrix& Matrix::operator+(const Matrix &b) //sums two matrices
{
// do things with your object here, using your algorithm and b
return *this;
}
Где я return *this
для операторов-членов, в этом нет особой необходимости, хотя это является обычным явлением и позволяет легко объединять операции в цепочку (если вам нравятся такие вещи). Вы можете найти больше информации о перегрузке оператора в своей книге.