C ++ операторы перегрузки для матричной структуры - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь создать матричную структуру с операторами перегрузки '+' и '='.

Матричная структура:

struct Matrix{
    int rows;
    int cols;
    std::vector<int> data;
    Matrix(int rows, int cols, int val);    //creates matrix row*col and fills every position with val
    Matrix(const Matrix &m);    //copy constructor
    Matrix(int rowcol = 0);    //creates matrix rowcol*rowcol filled with zeros
    Matrix & operator=(const Matrix &m);
    void printMatrix();    //prints the matrix
    ...
};

Операторы:

Matrix & Matrix::operator=(const Matrix &m) //assings matrix m to the new matrix
{

}

Matrix operator+(const Matrix &a, const Matrix &b) //sums two matrices
{
    //I know how to make the algorithm for summing two matrices, however i don´t know how
    //to return the result into existing matrix
}

И основная функция:

int main(){
    Matrix A(3,3,1);
    Matrix B(3,3,2);
    Matrix C(3,3,0);

    C = A + B;
    C.printMatrix();
    ...

    return 0;
}

Я не знаю, как заставить это работать. Я пробовал что-то подобное для оператора '=':

Matrix & Matrix::operator=(const Matrix &m)
{
    static matrix d(m);    //using copy constructor
    return d;
}

, но это не сработало. Создана новая матрица с размерами 0x0. Любой совет, как это реализовать?

1 Ответ

0 голосов
/ 28 марта 2020

Рабочий способ реализации этого 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 для операторов-членов, в этом нет особой необходимости, хотя это является обычным явлением и позволяет легко объединять операции в цепочку (если вам нравятся такие вещи). Вы можете найти больше информации о перегрузке оператора в своей книге.

...