Не правильно работает перемножение матриц в классе, в чем может быть ошибка?

Почему не перемножает матрицы? Пробовал передавать сразу 3 параметра(матрицы A,B,C), все равно внутрь цикла не заходит и выводит ошибку segmentation fault, или ‘matrixMultiplic’ was not declared in this scope.

#include <cmath>
#include <iostream>
#include <random>

using namespace std;

template <class T> class Matrix {
public:
  int sizeMatrix; // матрица квадратная
  T **matrix;

public:
  Matrix() {
    sizeMatrix = 0;

    matrix = new T *[sizeMatrix];

    for (int i = 0; i < sizeMatrix; i++) {
      matrix[i] = new T[sizeMatrix];
    }
  }
  Matrix(int sizeMatrix) {

    this->sizeMatrix = sizeMatrix;

    matrix = new T *[sizeMatrix];

    for (int i = 0; i < sizeMatrix; i++) {
      matrix[i] = new T[sizeMatrix];
    }
  }

  void fillMatrix() {

    for (int i = 0; i < sizeMatrix; i++) {
      for (int j = 0; j < sizeMatrix; j++) {
        matrix[i][j] = (random() % 100) / 2.5;
      }
    }
  }

  Matrix matrixMultiplic(Matrix<T> &A, Matrix<T> &B) {

    if (A.sizeMatrix != B.sizeMatrix) {
      cout
          << "Количество столбцов матрицы A не равно количеству строк матрицы B"
          << endl;
      return -1;
    }
    Matrix<T> C(sizeMatrix);
    for (int i = 0; i < sizeMatrix; i++) {
      cout << i << endl;
      for (int j = 0; j < sizeMatrix; j++) {
        C.matrix[i][j] = 0;
        for (int k = 0; k < sizeMatrix; k++) {
        C.matrix[i][j] += A.matrix[i][k] * B.matrix[k][j];
        }
      }
    }
    return C;
  }

  void printMatrix() {

    for (int i = 0; i < sizeMatrix; i++) {
      for (int j = 0; j < sizeMatrix; j++) {
        cout << matrix[i][j] << " ";
      }
      cout << endl;
    }
    cout << endl;
  }
};


int main() {

  Matrix<int> A(3);
  A.fillMatrix();
  Matrix<int> B(3);
  B.fillMatrix();

  A.printMatrix();
  B.printMatrix();

  Matrix<int> C();

  C = matrixMultiplic(A, B);

}

Ответы (1 шт):

Автор решения: Harry

Начнем с мелочей — не random(), а rand(). Ваша функция matrixMultiplic — член класса, значит, должна предваряться именем объекта с точкой. Объявление Matrix<int> C(); — это объявление функции, возвращающей Matrix... Конструктор по умолчанию пытается выделять нулевого размера память. Нет нормального деструктора, копирующего конструктора и т.п. — а значит, проблемы с памятью неизбежны! Явно это не все, что-то я пропустил, но это бросается в глаза.

Ну, а само умножение... Я бы сделал его оператором вне класса, примерно так —

template<class T>
Matrix<T> operator *(const Matrix<T> &A, const Matrix<T> &B)
{
    if (A.sizeMatrix != B.sizeMatrix) throw("Количество столбцов матрицы A не равно количеству строк матрицы B");

    Matrix<T> C(A.sizeMatrix);
    for (int i = 0; i < A.sizeMatrix; i++)
    {
        for (int j = 0; j < A.sizeMatrix; j++)
        {
            C.matrix[i][j] = 0;
            for (int k = 0; k < A.sizeMatrix; k++) {
                C.matrix[i][j] += A.matrix[i][k] * B.matrix[k][j];
            }
        }
    }
    return C;
}

Раз уж у вас все члены открыты...

Ну, а в коде main

Matrix<int> C;
C = A*B;
C.printMatrix();

Вот только еще раз — без правильных конструктора копирования, оператора присваивания и деструктора — все это работать нормально не будет!

→ Ссылка