У меня проблемы с перегрузкой оператора = динамическими массивами. Это то, что я до сих пор. Также я знаю, что не написал свой деструктор или конструктор, но сначала мне нужно сосредоточиться на этом операторе:
В моем заголовочном файле:
#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
Я вижу только основные проблемы прямо сейчас;
Во-первых, вы выделяете память 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];
}
}
Наиболее важными частями этого конструктора копирования являются аргументы& Тип — если это не сделано таким образом, вызов станет рекурсивным — и что дубликат делается. Всякий раз, когда динамически распределенная память принадлежит объекту, нужно быть очень осторожным, чтобы убедиться, что у него есть конструктор копирования, который выделяет новую память каждый раз, когда он вызывается, иначе конструктор по умолчанию просто передаст право собственности на копию этой копии, вызывая это должно быть удалено с копией. Следует также отметить, что ссылки должны использоваться для передачи объекта этого типа, когда это возможно, поскольку перераспределение памяти с копией стоит дорого.