C++ C++;-创建二维副本构造函数

C++ C++;-创建二维副本构造函数,c++,multidimensional-array,dynamic-arrays,C++,Multidimensional Array,Dynamic Arrays,我正在努力学习我的期末考试,我试着把我的动态2d数组拷贝构造函数组合起来。当我创建备份并打印它以查看它是否工作时,它会反复打印出我相信的相同内存地址。这是我的复制构造函数: 更新,这里是我从文件.txt读取数据的地方 void Matrix::readTemps(ifstream &inFile) { while (!inFile.eof()) { for (int row = 0; row < mnumRows; row++) {

我正在努力学习我的期末考试,我试着把我的动态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];
}
void矩阵::readTemps(ifstream和infle)
{
而(!infle.eof())
{
对于(int row=0;row>临时[行][列];
}
}
}
}
矩阵::矩阵(常数矩阵和原始矩阵)
{
mnumRows=原始.mnumRows;
mnumCols=原始的.mnumCols;
Temps=新的双*[mnumRows];
对于(int row=0;row

矩阵和矩阵::运算符=(常数矩阵和秒)
{  
如果(此!=&秒)
{
删除[]个临时文件;
mnumRows=second.mnumRows;
mnumCols=second.mnumCols;
Temps=新的双精度*[second.mnumRows];
对于(int row=0;row
更新,这在my 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;
//重载赋值运算符的示例。
矩阵测试矩阵;
TestMatrix=NYCTemps;
//复制构造函数的示例。
矩阵副本(NYCTemps);//复制电话簿的传统方式。
NYCTemps.display();
copyOfMatrix.display();

cout在您的复制构造函数版本中 和复制仅分配的分配运算符 二维数组的内存,但不从原始数组复制值 将矩阵转换为新矩阵

您应该在两种方法中都添加这些行

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]
for(int r=0;r
Temps是二维数组,因此在复制赋值运算符中 必须由删除(首先删除为每行中的列分配的内存,然后删除行中的内存)

for(int r=0;r
数组值本身的复制在哪里?请阅读。在你的问题中显示一个OK我用更多的代码更新了这个问题,但我需要知道的主要事情是我的复制构造函数和重载赋值运算符是否正确。我从中提取数据的文件是一个随机文本文件,温度范围从1869到2017I。我添加了这些行,但它们给了我一个错误:ClimateChange.exe中0x001E4576抛出异常:0xC0000005:访问冲突写入位置0xCDCD。我在这一行得到错误:Temps[r][c]=original.Temps[r][c]@SmithJohn错误表示您正在写入未分配的内存,所以在创建数组之前添加了这些行。在
Temps=new double*[mnumRows]之后添加这些行;对于(int row=0;row以前没有。谢谢,这就是问题所在。非常感谢。
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]
for (int r = 0; r < mnumRows; ++r)
    delete[] Temps[r];
delete[] Temps;