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

1 ответ

Решение

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

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

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

в частности, если вы размещаете этот класс в стеке когда-либо, не создаете явный конструктор копирования и не убедитесь, что вы всегда возвращаете копию, данные объекта будут удалены (я предполагаю, что вы собираетесь удалить [] '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];
  }
}

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

Другие вопросы по тегам