C ++: перегрузка матричных операторов - PullRequest
0 голосов
/ 27 сентября 2018

Я прохожу курс ООП в колледже, мы должны перегрузить операторы +, -, *, + =, - = и некоторые другие для обработки операций с матрицами, используя только структуры и перегрузка операторов ,Я придумал этот код, пользователь вводит массив 1D , а затем этот массив превращается в массив 2D или матрица .

Функция createMatrix возьмет 1D-массив и затем определит количество строк и столбцов затем поместите значения в этом массиве в структуру matrix или в элемент в структуре, чтобы быть конкретными.затем я определил +, - и <<. </p>

Это еще не завершено, но программа ничего не выводит, и я не могу найти, где находится ошибка, в операторе '+'или оператор «<<», который обрабатывает вывод матриц. </p>

#include <iostream>
#include <algorithm>
using namespace std;

struct matrix{
    int* data;          //since it is a 1d array which will later be stored in the matrix
    int row, col;
};

void createMatrix(int row, int col, int num[], matrix& mat);    //by reference so that I fetch it by address from memory


matrix operator+ (matrix mat1, matrix mat2){          //Addition
    matrix mat;
    for(int i = 0; i < max(mat1.row*mat1.col, mat2.row*mat2.col); i++){
        mat.data[i] = mat1.data[i] + mat2.data[i];

    }
    return mat;
}

matrix operator- (matrix mat1, matrix mat2){          //Subtraction
    matrix mat;
    for(int i = 0;i < max(mat1.row*mat1.col, mat2.row*mat2.col); i++){
        mat.row = mat1.row - mat2.row;

    }
    return mat;
}

 ostream operator<< (ostream& out, matrix mat){
     for(int i = 0; i < ((mat.row)*(mat.col)); i++){
         if(i % mat.row == 0 ){
             cout<<endl;
         }
         else{out<<mat.data[i]<<" ";}
     }
 }
 int main()
 {
     int row1, col1;
     int row2, col2;

     cout<<"Enter Rows of first matrix: "; cin>>row1;
     cout<<"Enter Cols of first matrix: "; cin>>col1;

     cout<<"Enter Rows of second matrix: "; cin>>row2;
     cout<<"Enter Cols of second matrix: "; cin>>col2;

     int arr1[row1*col1], arr2[row2*col2];
     cout<<"Enter the values you which to add in the first matrix: ";
     for(int i = 0; i < row1*col1; i++){
         cin>>arr1[i];
     }
     cout<<"Enter the values you which to add in the second matrix: ";
     for(int i = 0; i < row2*col2; i++){
         cin>>arr2[i];
     }

     matrix mat1, mat2, mat3;
     createMatrix(row1, col1, arr1, mat1);
     createMatrix(row2, col2, arr2,  mat2);
     mat3 = mat1 + mat2;
    cout<<mat3;

    return 0;
}

void createMatrix(int row, int col, int num[], matrix& mat){
     mat.row = row;
     mat.col = col;
     mat.data = new int [col * row];             //We are trying to make a matrix from a 1d array, so we will stretch the matrix -which is a 2d array
     for(int i = 0; i < col * row; i++){             //in 1-D of size row *col
         mat.data[i] = num[i];                    //Depending on the parameter the data array will be filled dynamically
     }
 }

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Когда вы перегружаете operator<<, который вернет std::ostream, вы всегда должны возвращать ссылку на него.Пример:

ostream& operator<< (ostream& out, matrix mat) {
    out << mat.col << mat.data << mat.row;
    return out;
}

Кроме того, вы не можете просто создать массив, размер которого еще не известен во время компиляции.cin является операцией ввода / вывода.Таким образом, размер не известен во время компиляции, но во время выполнения.

0 голосов
/ 27 сентября 2018

Ваш оператор + вызовет segfault, потому что вы не распределили mat.data, используя new.Вам нужно сделать

matrix mat;
mat.data = new int [max(mat1.row*mat1.col, mat2.row*mat2.col)];

В любом случае, ваша логика сложения матриц не будет работать и вызовет еще один segfault. Я предлагаю взглянуть на эту страницу , чтобы узнать, как справиться с этим.В нем говорится об использовании двумерных матриц, которые должны упростить логику, а не работать с одномерным массивом / вектором.

Так что, если у вас есть два двумерных массива, a и b, вы можете добавитьим так:

for(i = 0; i < min(a_row, b_row); ++i)
    for(j = 0; j < min(b_col, a_col); ++j)
        sum[i][j] = a[i][j] + b[i][j];
...