Не удается получить доступ к массиву указателей из другой функции

#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. Теперь это должно сработать. Я удалил объявление, но сохранил выделение. Вам все равно нужно исправить деструктор, иначе произойдет утечка памяти.