Я пытаюсь создать класс 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;
Эта строка:
Complex** matrix = new Complex*[sizer];
объявляет новый объект с именем matrix
который является локальным для области конструктора. Его имя скрывает член данных с тем же именем. Поэтому, когда вы нарушаете его внутри операторской функции, вы будете перенаправлять элемент данных, значение которого не изменилось с NULL
, следовательно, сбой.
Уберите тип, а затем он станет назначением:
matrix = new Complex*[sizer];