用于动态多维数组错误的 C++ 重载赋值运算符

C++ Overloading assignment operator for dynamic multi dimensional array error

提问人:Brogrammer 提问时间:7/4/2015 最后编辑:Brogrammer 更新时间:7/6/2015 访问量:2203

问:

我在使用动态数组重载 = 运算符时遇到了问题。这就是我目前所拥有的。另外,我知道我还没有编写析构函数或构造函数,但我需要先关注这个运算符:

在我的头文件中:

#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++ 重载 赋值运算符 三法则

评论

0赞 user4578093 7/4/2015
你能详细说明一下你遇到了什么样的麻烦吗?
0赞 Brogrammer 7/4/2015
@user4578093字面上,我不知道我在做什么,我需要帮助重载动态数组的 = 运算符。我不知道我是否走在正确的轨道上,我的记忆力很弱
0赞 Ryan Haining 7/6/2015
即使你有一个“templated operator=”,你仍然需要非模板化版本,否则编译器会为你生成一个。

答:

0赞 user4578093 7/4/2015 #1

我现在只关注重大问题;

第一,您正在为新数据数组分配 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];
  }
}

这个复制构造函数最重要的部分是参数是 const& 类型——如果不这样做,调用将变得递归——并且正在进行重复。每当动态分配的内存属于某个对象时,必须非常小心地确保它有一个复制构造函数,该构造函数在每次调用时都会分配新的内存,否则默认构造函数只会将内存的所有权也授予副本,从而导致它与副本一起删除。您还应该注意,应尽可能使用引用来传递此类型的对象,因为使用副本重新分配内存的成本很高。

评论

0赞 user4578093 7/4/2015
有没有办法,或者你在问什么?我的意思是,如果你真的想使用多维数组(不建议这样做),你可以在第一个行分配一个 int 指针数组;int*[c.m],然后使用循环为数组中的每个条目分配一个 int 数组,我将在我的答案中添加一个示例。
0赞 Brogrammer 7/5/2015
你的两个例子都放在赋值运算符中,还是只是你的第一个例子,而你删除矩阵的示例放在析构函数中?此外,除了创建多维数组之外,我的复制构造函数是否应该与我的任务运算符相同,如果不是,那么我该如何创建一个?
0赞 user4578093 7/6/2015
第一个用于赋值,尽管第一个的前半部分可以在构造函数中使用,但第二个用于析构函数。我会尽快回复你关于那个复制构造函数
0赞 Brogrammer 7/6/2015
好的,我等着了,谢谢你试图帮助我
0赞 user4578093 7/7/2015
它在底部