C ++ - Создать конструктор 2D копирования - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь готовиться к финалу, и я пытался собрать свой динамический конструктор копирования 2d массива.Когда я создал свою резервную копию и распечатал ее, чтобы увидеть, работает ли она, она печатает один и тот же адрес памяти, в который я верю снова и снова.Это мой конструктор копирования: Обновление, вот где я читаю данные из моего файла .txt

void Matrix::readTemps(ifstream &inFile) 
{
    while (!inFile.eof())
    {
        for (int row = 0; row < mnumRows; row++)
        {
            for (int col = 0; col < mnumCols; col++)
            {
                inFile >> Temps[row][col];
            }
        }
    }
}
Matrix::Matrix(const Matrix & original) 
{
    mnumRows = original.mnumRows;
    mnumCols = original.mnumCols;
    Temps = new double*[mnumRows];
    for (int row = 0; row < mnumRows; row++) 
        Temps[row] = new double[mnumCols];
}

Matrix& Matrix::operator=(const Matrix & second)  
{  
    if (this != &second)
    {
        delete[] Temps;
        mnumRows = second.mnumRows;
        mnumCols = second.mnumCols;
        Temps = new double*[second.mnumRows];
        for (int row = 0; row < mnumRows; row++)
            Temps[row] = new double[mnumCols];
    }
    return *this;
}

ОБНОВЛЕНИЕ, и это в моем main.cpp:

//Example of overloaded assignment operator.
Matrix TestMatrix;
TestMatrix = NYCTemps;

//Example of copy constructor.
Matrix copyOfMatrix(NYCTemps); // The traditional way to copy the phonebook.

NYCTemps.display();
copyOfMatrix.display();
cout << endl;

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

1 Ответ

0 голосов
/ 18 мая 2018

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

Вы должны добавить эти строки в обоих методах

for (int r = 0; r < mnumRows; ++r)
    for (int c = 0; c < mnumCols; ++c)
        Temps[r][c] = original.Temps[r][c];  // or second.Temps[r][c]

Temps - это 2-мерный массив, поэтому в операторе назначения копирования его необходимо удалить (сначала удалите память, выделенную для столбцов в каждой строке, затем удалите память из строк)

for (int r = 0; r < mnumRows; ++r)
    delete[] Temps[r];
delete[] Temps;
...