C ++: сбой при ссылке на элемент 2D-массива при перегрузке ostream >>

0

Я пытаюсь создать класс Matrix, который содержит 2D-массив, используя динамически выделенную память.

class Matrix{
  int sized;
  Complex **matrix = NULL;
public:
  Matrix(int);
  Matrix(int, vector<Complex>);
  Matrix();
  bool checkDom(Matrix, Matrix);
  int size();
  void size(unsigned int);

Вот мой конструктор для Matrix, который копирует значения типа Complex в каждый элемент.

Matrix::Matrix(int sizer, vector<Complex> inputList) {

  sized = sizer;

  //Init all to 0+0i
  Complex** matrix = new Complex*[sizer];
  for (int i = 0; i < sizer; ++i)
      matrix[i] = new Complex[sizer];

  int count = 0;

  //Copy vector values into matrix
  for (int i = 0; i < sized; i++) {
    for (int j = 0; j < sized; j++) {
        matrix[i][j] = inputList[count];
        count++;
    }
}

}

Если я вставляю инструкцию cout в этот конструктор, элементы матриц будут печатать правильно:

//inside of constructor, prints all elements without a problem
for (int i = 0; i < sized; i++) {
        for (int j = 0; j < sized; j++) {
            os << right << setw(6) << matrix[i][j];
        }
            os << endl;
    }

Однако, когда оператор перегружает оператор >> для печати матрицы, он вылетает (во время компиляции ошибки нет).

friend ostream &operator<<(ostream &os, Matrix &matprint){
    for (int i = 0; i < matprint.sized; i++) {
        for (int j = 0; j < matprint.sized; j++) {
            os << right << setw(6) << matprint.matrix[i][j];
        }
            os << endl;
    }
    return os;
}

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

Необработанное исключение в 0x000E8943 в ConsoleApplication7.exe: 0xC0000005: место чтения нарушения доступа 0x00000000.

Мой отладчик также отображает значение matprint.matrix как 0x00000000. У меня возникли проблемы с выяснением того, где моя ссылка идет не так! Благодарю!

Здесь вызывается оператор, в основном:

Matrix  mat2(2, mat_vals);
cout << mat2;
  • 0
    Вы уже использовали отладчик, чтобы отследить проблему?
  • 0
    Покажите нам код, где вы вызываете оператора.
Показать ещё 4 комментария
Теги:
arrays
dynamic
memory
allocation

1 ответ

2
Лучший ответ

Эта строка:

Complex** matrix = new Complex*[sizer];

объявляет новый объект с именем matrix который является локальным для области конструктора. Его имя скрывает член данных с тем же именем. Поэтому, когда вы нарушаете его внутри операторской функции, вы будете перенаправлять элемент данных, значение которого не изменилось с NULL, следовательно, сбой.

Уберите тип, а затем он станет назначением:

matrix = new Complex*[sizer];

Ещё вопросы

Сообщество Overcoder
Наверх
Меню