Перегрузка оператора << для печати элементов матрицы в шаблонном классе - PullRequest
0 голосов
/ 16 февраля 2019

почему у меня ошибка в операторе '[]'.Я хотел напечатать содержимое моей матрицы.Если я не могу использовать скобки, что я могу сделать тогда?

вот пример кода:

#include <iostream>
#include <vector>

template <typename T>
class Matrix {
    private:
    int m; int n;
    std::vector<T> x;
    std::vector<std::vector<int>> Mat;


    public:
    Matrix (const unsigned int &m, const unsigned int &n, std::vector<T> x);
    Matrix(const Matrix &M);
    Matrix<T> operator = (const Matrix &M);
    // Matrix<T> operator [](const int &index);

    friend std::ostream& operator << (std::ostream& os, const Matrix<T> &M) {
        os << "[";
        for (int i = 0; i< M.m; i++){
            for (int j = 0; j< M.n; j++){
                os << M[i][j] << ' ';
            }
            os << '\n';
        }
        os << "]\n";
        return os;
    }
};

Я исправил ошибки.Но это не печатает мою матрицу.Это мое основное:

int main(){
    std::vector<int> x = {1,2,3,4};
    Matrix<int> A{2,2,x};
    Matrix<int> B{2,2,x};
    std::cout << A;
    std::cout << B;
    return 0;
}

А это мой конструктор, мне нужно было сделать матрицу из вектора, где я определяю строки и столбцы.

template <typename T>
    Matrix<T>::Matrix (const unsigned int &m, const unsigned int &n, std::vector<T> x){ //constructor
    this -> m = m;
    this -> n = n;
    this -> x = x;

    int index = 0;
    for (int i = 0; i<m; i++){
        for (int j = 0; j<n; j++){
             Mat[i][j] = x[index];
            index++;
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

Проблема заключается в следующей строке:

os << M[i][j] << ' ';

Поскольку M имеет тип Matrix<T> и вы не определили оператор [], любые попытки использовать оператор [] приведут к ошибке.

Вместо этого Вы должны использовать элемент данных Mat.

friend std::ostream& operator << (std::ostream& os, const Matrix<T> &M) {
    os << "[";
    for (int i = 0; i< M.m; i++){
        for (int j = 0; j< M.n; j++){
            os << M.Mat[i][j] << ' '; // using M.Mat instead of M
        }
        os << '\n';
    }
    os << "]\n";
    return os;
}

Редактировать:

Согласно обновленному коду вы можете получитьхорошая ошибка SIGSEGV (ошибка сегментации).Зачем?Просто.Вы не изменяете размер своего элемента данных Mat.

Вы должны сделать это:

template <typename T>
    Matrix<T>::Matrix (const unsigned int &m, const unsigned int &n, std::vector<T> x){ //constructor
    this -> m = m;
    this -> n = n;
    this -> x = x;

    int index = 0;

    // resizing Matrix according to our need i.e. m rows and n columns
    Mat.resize(m);
    for (unsigned int i = 0; i < Mat.size(); i++) {
        Mat[i].resize(n);
    }

    for (unsigned int i = 0; i<m; i++){
        for (unsigned int j = 0; j<n; j++){
             Mat[i][j] = x[index];
            index++;
        }
    }
}
0 голосов
/ 16 февраля 2019

В вашем коде есть разные ошибки:

1.- Ваш конструктор:

 Matrix<T>::Matrix (const unsigned int &m, const unsigned int &n, std::vector<T> x)

Не рекомендуется передавать вектор по значению, всегда лучше передавать егопо ссылке и никогда не передавайте целое число по константной ссылке, передайте его по значению:

 Matrix<T>::Matrix (unsigned int m, unsigned int n, const std::vector<T>& x)

2.- Это не ошибка, но обычно вам не нужно использовать «this->»,и лучше построить объект наподобие:

Matrix<T>::Matrix (unsigned int m0, unsigned int n0, const std::vector<T>& x0)
      : m{m0}, n{n0}, x{x0} {...}

3.- Я не понимаю, почему вы делаете 2 копии одного и того же элемента: один в вашем векторе x, а другой - на M.объем памяти.Может быть, с x достаточно?

4.- Вы определяете m и n как int со знаком, но в своем конструкторе вы используете "unsigned" int.Какой из них вы хотите использовать?

Я предлагаю следующие изменения:

1.- Если вы хотите получить доступ к элементу (i, j), напишите оператор:

  Matrix& operator()(unsigned int i, unsigned int j);

его легко использоватьваш вектор x.

2.- Чтобы написать все элементы, вы можете написать что-то вроде:

std::ostream& operator << (std::ostream& os, const Matrix<T>& M) {
    os << "[";
    for (int i = 0; i< M.rows(); ++i){
        for (int j = 0; j< M.cols(); ++j){
            os << M(i, j) << ' ';
        }
        os << '\n';
    }
    os << "]\n";
    return os;
}

, и это не функция-друг (если вы определяете row () и cols ()).

0 голосов
/ 16 февраля 2019

ваш оператор [] возвращает матрицу.Вы должны изменить его на значение вашего шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...