Распечатка матрицы в c ++, проблема метода класса - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу отобразить матрицу, используя класс и методы. Я получаю "C: \ Users \ PC \ AppData \ Local \ Temp \ cc41EMS5.o: lab6. cpp :(. Text + 0x3d6): неопределенная ссылка на` Matrix :: Matrix () "collect2.exe: ошибка: ld вернул 1 состояние выхода "ошибка. Я думаю, это из-за метода printMatrix (который работал не как метод в main), но я не знаю, как это исправить. Вот код:

#include <cmath>
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

class Matrix {
public:
    Matrix();
    Matrix(int rowSize, int colSize);
    void setSize(int rowSize, int colSize);
    string printMatrix(int rowSize, int colSize);
    void free_data();
    void allocate_data();

private:
    int rowSize;
    int colSize;
    double **p;
    //vector<vector<int>> matrix(rowSize, vector<int>(colSize));
};

void Matrix::allocate_data() {
    p = new double *[rowSize];
    for (int i = 0; i < rowSize; i++) {
        p[i] = new double[colSize];
    }
}

void Matrix::free_data() {
    for (int i = 0; i < rowSize; i++) {
        delete[] p[i];
    }
    delete[] p;
}

void Matrix::setSize(int rowSize, int colSize) {
    int newSize = 0;
    p[rowSize][colSize] = newSize;
}

Matrix::Matrix(int rowSize, int colSize) {
    this->rowSize = rowSize;
    this->colSize = colSize;
    allocate_data();
    for (int i = 0; i < rowSize; i++) {
        for (int j = 0; j < colSize; j++) {
            p[i][j] = 0;
        }
    }
}

string Matrix::printMatrix(int rowSize, int colSize) {
    int i, j;
    int matrix[i][j];
    for (int i = 0; i < rowSize; i++) //it worked in main, but doesn't in class
    {
        for (int j = 0; j < colSize; j++) {
            0 >> matrix[i][j];
        }
        cout << endl;
    }
    cout << "Matrix" << endl;
    for (int i = 0; i < rowSize; i++) {
        for (int j = 0; j < colSize; j++) {
            cout << matrix[i][j] << " ";
        }
        cout << "\n";
    }
    cout << endl;
}

int main() {
    int rowSize;
    int colSize;
    cout << "Enter size of rows and columns: ";
    cout << "Rows: ";
    cin >> rowSize;
    cout << "Cols: ";
    cin >> colSize;

    Matrix m;

    m.printMatrix(rowSize, colSize);

    return 0;
}

Пожалуйста, отправьте помощь

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Вы объявляете два конструктора:

    Matrix();
    Matrix(int rowSize, int colSize); 

Но вы определяете только один:

Matrix::Matrix(int rowSize, int colSize)       
{
    this->rowSize=rowSize;
    this->colSize=colSize;
    allocate_data();
    for(int i=0; i<rowSize; i++)
    {
        for(int j=0; j<colSize; j++)
        {
            p[i][j]=0;
        }
    }
} 

Кроме того, в main вы вызываете конструктор, который вы случайно не определили:

Matrix m;

Вместо этого избавьтесь от объявления для Matrix::Matrix(), так как у вас нет определения, и используйте конструктор, который принимает два Аргументы:

int main()
{
    int rowSize;
    int colSize;
    cout<<"Enter size of rows and columns: ";
    cout<<"Rows: ";
    cin>>rowSize;
    cout<<"Cols: ";
    cin>>colSize;

    Matrix m(rowSize, colSize);

    m.printMatrix(rowSize,colSize);

return 0;
}

Дополнительные улучшения

Вам не нужно передавать размер матрицы в Matrix::printMatrix, так как матрица уже имеет размер в качестве членов. Передав эти параметры в printMatrix, you're making the class more confusion and error-prone to use. If I constructed a 3x3 matrix and tried to call printMatrix (10,10) `на нем, я, безусловно, вызову неопределенное поведение и, скорее всего, выполню sh программу.

Избавимся от параметров (как в определении, так и в объявлении). ) и использовать существующие поля rowSize и columnSize для управления циклами в этой функции. Тип возвращаемого значения также должен быть void.

Кроме того, 0 >> matrix[i][j]; не имеет смысла. Правильный синтаксис: matrix[i][j] = 0;.

1 голос
/ 24 апреля 2020

Вы определяете и используете конструктор без параметров Matrix ( Matrix (); ), но не реализуете его.

Вы можете либо:

  • Удалите определение Matrix () и используйте заданный вами конструктор ( Matrix m (rowSize, colSize); )

  • Реализовать конструктор без параметров, создав матрицу с некоторыми предопределенными значениями. Вы можете использовать делегирующий конструктор для вызова конструктора, который принимает параметры

    Matrix::Matrix() : Matrix(4,4) {
    }
    

Я бы порекомендовал первый вариант

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