#c #arrays
#c #массивы
Вопрос:
Я подключаю эту матричную программу, которая создаст матрицу (2d-массив) и сохранит в них значение. В настоящее время у меня проблема с доступом к определенному элементу -mtx [rows] [cols]=value выдает ошибку «выражение должно быть указателем на тип объекта» с подчеркнутыми строками и столбцами
#include<iostream>
#include<cstdlib>
#include"matrix.h"
Matrix::Matrix(int rows, int cols)
{
int **mtx=new int*[rows];
for(int i=0; i<rows; i )
{
mtx[i]=new int[cols];
}
}
void Matrix::setElem(int rows, int cols, int value)
{
mtx[rows][cols] = value;
}
//.h file
#ifndef MATRIX_H
#define MATRIX_H
#include<cstdint>
class Matrix
{
int rows;
int cols;
int mtx;
public:
Matrix(int rows, int cols);
void setElem(int rows, int cols, int value);
};
#endif
Комментарии:
1.
int **mtx
создает переменную, которая является локальной для конструктора. У вас есть элемент по имениmtx
или вы хотели создатьmtx
элемент?2.
mtx
предполагается, что это переменная класса? Его определение ограничено конструктором, а не классом. Поэтому он не имеет видимости внутриsetElem
3. mtx является членом класса
4. обычно рекомендуется избегать затенения переменных между переменными-членами класса и параметрами его функций-членов. вместо этого вы могли бы написать _rows, _cols и _mtx в качестве членов вашего класса и строк, cols в качестве имен параметров. просто для поддержания всего в порядке.
Ответ №1:
Вы определяете свою матрицу в классе следующим образом
int mtx;
затем вы переопределяете его в конструкторе следующим образом
int **mtx;
Когда вы повторно определяете переменную класса в function it, вы переопределяете переменную класса для области действия этой функции после объявления переменной. Измените объявление в классе на
int **mtx;
и удалите его из конструктора, и он должен работать нормально. (Вам также нужен деструктор)
Это должно сработать
#include<iostream>
#include<cstdlib>
#include"matrix.h"
Matrix::Matrix(int rows, int cols)
{
//int **mtx=new int*[rows]; // removed
mtx=new int*[rows]; // just allocate
for(int i=0; i<rows; i )
{
mtx[i]=new int[cols];
}
this->rows = rows;
this->cols = cols;
}
void Matrix::setElem(int rows, int cols, int value)
{
mtx[rows][cols] = value;
}
//.h file
#ifndef MATRIX_H
#define MATRIX_H
#include<cstdint>
class Matrix
{
int rows;
int cols;
int **mtx; // added stars
public:
Matrix(int rows, int cols);
//~Matrix(void); // You also need a destructor.
void setElem(int rows, int cols, int value);
};
#endif
Комментарии:
1. спасибо, но теперь я получаю ошибку сегментации каждый раз, когда использую функцию setElem
2. Теперь это должно сработать. Я удалил объявление, но сохранил выделение. Вам все равно нужно исправить деструктор, иначе произойдет утечка памяти.