重载运算符返回的对象正在丢失 C++ 中的数据



我创建了一个存储指向动态 2D 数组的指针的类,我重载了"+"运算符,以便它返回两个矩阵的相加:

class matrix
{
    int * mat, row, col;
public:
    matrix(int r, int c)
    {
        row = r;
        col = c;
        mat = new int[row * col];
    }
    matrix operator + (matrix m)
    {
        matrix result(row, col);
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < col; j++)
            {
                result.mat[i * result.col + j] = mat[i * col + j] + m.mat[i * m.col + j]
            }
        }
        //result.display(); //result contains expected values i.e. added values
        return result;
    }
    matrix(matrix &m)
    {
      this->mat = m.mat;
      this->row = row;
      this->col = col;
    }

  ~matrix()
   {
     delete[] mat;
   }
  void operator = (matrix m)
{
    if (row != m.row || col != m.col)
    {
        cerr << "Incompatible Matrix Assignment";
        return;
    }
    else
    {
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j <col; j++)
            {
                mat[i * col + j] = m.mat[i * m.col + j];
            }
        }
    }
    return;
} 
};
int main()
{
    matrix m1(2, 2); //m1.input(); //input has been taken
    matrix m2(2, 2); //m2.input(); //input has been taken
    matrix m3(2, 2);
    m3 = m1 + m2;
    //m3.output;
}
类中的"+"函数

返回一个局部矩阵变量"result",它包含预期值,但是当函数返回结果时,只有 mat(矩阵类的数据成员(的前两个值包含垃圾,即 m[0][0] 和 m[0][1],其余数组变量具有预期值。使数组大小为 3X3 或 4X4 它不会产生差异,只有前两个变量包含垃圾。

遵循 0/3/5 的规则。 在这种情况下,0 规则是最好的。

在这 5 个特殊成员函数中:

  • 多托

  • 复制分配/CTOR

  • 移动分配/CTOR

手动实现其中的 0、3 或 5(DTOR 和分配/CTOR 对,全部 5 个或无(。 有时=delete可以代替手动实现它们。 如果您实现了 dtor 并且无法对移动/复制 ctors 执行任何操作,则您的代码可能会被破坏。

到目前为止,最简单的方法是遵循零规则。

std::vector<int> mat;

然后代替mat = new int[row * col];

mat.resize(row * col);

最后不要写 DTOR(析构函数(。

通过让资源管理类(

向量(管理资源,可以使业务逻辑类(矩阵(不充满容易出错的资源管理代码。

相关内容

  • 没有找到相关文章

最新更新