C++ 矩阵类 自赋值问题

2023-01-07

RT,这是我写的赋值运算符:
Matrix& operator =(const Matrix& rhs)

row=rhs.row;
col=rhs.col;
double *curr=new double[rhs,row*rhs.col];
curr=rhs.data;
int count=0;
while (count!=rhs.row*rhs.col)

*(curr+count)=*(rhs.data+count);
++count;
;
delete [] data;

data= new double [row*col];
data=curr;
return *this;
;
现在的问题是
Matrix mat2=mat;
赋值是正常的,但是
mat2=mat2,则会输出随机数。

我先输入了mat=[1 2;3 4],之后第一个矩阵是mat,Operator下的第一个矩阵是拷贝过来的,
Matrix mat2=mat;
随机数的矩阵是mat2自赋值的结果
mat2=mat2
谢谢大神们帮忙。 指针操作的问题吧:

while (count!=rhs.row*rhs.col)

*(curr+count)=*(rhs.data+count);
++count;
;
再这个循环里每次运算mat的值都发生变化,下一次就会继续使用变化后的值进行计算。个人感觉mat2=mat2后应该不是随机数,你多次运行一下试试,应该每次mat2=mat2后得到的都是一样的结果。。。追问

是的。每个元素的值都相同。如图

参考知识1 所有自赋值之前必须检查是否是自己,第一行必须是
if(this== &rhs) return *this;追问

谢谢指点,不过这里还有两个问题想请教一下。首先是,对于自己写的类来说,并没有"=="这个运算符,自定义略麻烦,而且执行这个检查效率也不高。其次的话,我当初以为自己已经考虑了自赋值问题。

在赋值运算符里面,我是先把右侧值携带的数组拷贝给临时的数组curr,再释放data,再把data绑定到临时数组上,按理来说不应该出现自赋值错误啊?

追答

double *curr=new double[rhs,row*rhs.col];
curr=rhs.data;//这里不会做内容拷贝,只是把指针赋值过去而已

追问

是的。但下面还有while,while那个循环才是拷贝元素的。拷贝元素完了以后把赋值对象原本指向的数组释放掉,重新建一个,就是data=new double[row*col],再把临时数组curr的首地址赋给data,在程序块结束的时候,curr会被释放,但它指向的数组并没有被释放,而data依然指向它,说实在的,我不是很想得出来这个做法错误在什么地方。

追答

curr=rhs.data;//这就是错误所在,curr经过此语句后再也不会指向你分配的内存

本回答被提问者和网友采纳
相似知识
c++ 定义一个computer类,有数据成员芯片(cpu),内存(ram),光驱(cdrom)等 参考知识1#include<iostream>#include<string>usingnamespacestd;classComputerprivate:stringcpu;
关于用c++求 阶乘之和的问题: 上面我们就不看了,直接从循环开始看。这是做10的阶乘。因为每次循环的过程都是一样的,为方便后面的叙述,我将这个程序改为计算5的阶乘,就是只把循环条件改为i<=5,其他条件不变,不影响程序本身的思
赋值具有的非单一 rhs 维度多于非单一下标数,怎么办 opt=optimset('Algorithm','active-set',)。x0=[2.5217]。[x,FVAL]=fmincon。程序现问题给初始解行域内说满足
如何将int型数值赋值给char型数组 int型是四个字节大小,char型是一个字节。所以int型赋值给char数组需要把int型拆分。int型拆分成四个字节,按顺序保存在char型数组中就可以了。具体代码如下:inti=4;chara[1
矩阵切换器与视频矩阵的区别 视频矩阵是矩阵切换器的1类。例如矩阵切换器的分类:视频矩阵(AV矩阵、VGA矩阵、DVI矩阵、HDMI矩阵、RGB矩阵、YPbPr矩阵)、音频矩阵(数字媒体矩阵)等。因此他们是一种包含与被包含的关系。
软件工程学啥? 参考知识1软件工程主要学C++程序设计、java、python、高等数学、数据结构、算法设计与分析、汇编语言程序设计、数据库系统、软件工程等。软件工程主要需要学的:C++程序设计、java、pytho
视频矩阵的相关产品 分配器:将单路信号在没有信号损失的情况下分成多路相同的信号,输出给多个显示设备。长线驱动器:整合VGA信号在长距离传输中出现的拖尾重影等问题。选择器:将多路输入信号选择其中一路输出给显示设备。切换矩阵
matlab生成三维数据化网格。希望各位高手能知道一下。谢谢! d=0.02;r1=0.3;x=-r1:d:r1;y=-r1:d:r1;%赋值:x=[-0.3 0.3] y=[-0.3 0.3] 跨度都是0.02for&nb