gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:46:13 24 4
gpt4 key购买 nike

我创建了一个存储指向动态二维数组的指针的类,我重载了“+”运算符,以便它返回两个矩阵的加法:

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个特殊的成员函数:

  • dtor

  • 复制赋值/构造函数

  • 移动赋值/构造函数

手动实现其中的 0、3 或 5 个(dtor 和一个赋值/ctor 对,全部 5 个,或无)。有时 =delete 可以代替手动实现它们。如果您实现了一个 dtor 并且没有对移动/复制 ctors 做任何事情,您的代码可能会被破坏。

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

std::vector<int> mat;

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

mat.resize(row * col);

终于不写dtor(析构函数)了。

通过让资源管理类( vector )管理您的资源,您可以使您的业务逻辑类(矩阵)不会充满容易出错的资源管理代码。

关于c++ - 重载运算符返回的对象在 C++ 中丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49210396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com