C ++ Перегрузочный оператор присваивания для ошибки динамического многомерного массива

У меня проблемы с перегрузкой оператора = динамическими массивами. Это то, что я до сих пор. Также я знаю, что не написал свой деструктор или конструктор, но сначала мне нужно сосредоточиться на этом операторе:

В моем заголовочном файле:

#ifndef fasdf_dynn_h
#define fasdf_dynn_h

#include <iostream>
#include <fstream>
#include<string>
#include <cstdlib>
#include <vector>

using namespace std;
template <class T>

class MatrixdynVector{

public:
template <class H>
MatrixdynVector<H>& operator =(const MatrixdynVector<H>& c)
{
if (this == &c)//checks for self assignment
{
return *this;
}
else
{
delete [] matrix;
matrix=new int[c.m*n];
this->m=c.m;
this->n=c.n;
return *this;

}
}
private:
int m,n;
int** matrix;
};#endif

0

Решение

Я вижу только основные проблемы прямо сейчас;

Во-первых, вы выделяете память c.m * this-> n для вашего нового массива данных. Я предполагаю, что вы хотите выделить память c.m * c.n.

и наконец, я настоятельно рекомендую вам внимательно взглянуть на конструктор копирования, поскольку функция удаления может привести к повреждению данных при возврате матрицы этого типа.

в частности, если вы размещаете этот класс в стеке когда-либо, не создаете явный конструктор копирования и не убедитесь, что вы всегда возвращаете копию, данные объекта будут удалены (я предполагаю, что вы собираетесь удалить [] ‘matrix’ в вашем деструкторе) в конце, и возвращенный объект будет иметь ‘matrix’, указывающую на удаленные данные. У меня была именно эта проблема, когда я сделал свой собственный класс матрицы.

Если вы действительно хотите многомерный массив, вы можете создать его следующим образом;

matrix = new int*[c.m];
for (int i = 0; i < c.m; i++)
matrix[i] = new int[c.n]; // create a multi dimensional array

for (int i = 0; i < c.m; i++)
for (int j = 0; j < c.n; j++)
matrix[i][j] = c.matrix[i][j]; // add data to it

и я почти забыл, что для деструктора вам нужно будет также удалить матрицу с циклом for;

for (int i = 0; i < c.m; i++)
delete[] matrix[i]; // delete the second dimension of the matrix

delete[] matrix; // delete the first

Вот пример конструктора копирования

MatrixdynVector<H>::MatrixdynVector(const MatrixdynVector<H>& oMat)
: m(oMat.m), n(oMat.n), matrix(new int*[oMat.m]){
for (int i = 0; i < m; i++){
matrix[i] = new int[n];
for (int j = 0; j < n; j++)
matrix[i][j] = oMat.matrix[i][j];
}
}

Наиболее важными частями этого конструктора копирования являются аргументы& Тип — если это не сделано таким образом, вызов станет рекурсивным — и что дубликат делается. Всякий раз, когда динамически распределенная память принадлежит объекту, нужно быть очень осторожным, чтобы убедиться, что у него есть конструктор копирования, который выделяет новую память каждый раз, когда он вызывается, иначе конструктор по умолчанию просто передаст право собственности на копию этой копии, вызывая это должно быть удалено с копией. Следует также отметить, что ссылки должны использоваться для передачи объекта этого типа, когда это возможно, поскольку перераспределение памяти с копией стоит дорого.

0

Другие решения


По вопросам рекламы [email protected]