昨天作了象素的测试题,人家说我做错了#¥%◎#,请高手帮忙看一下吧~(我C++大菜)

Azitec 2004-11-18 09:48:06
要求:
写一个运行期指定行列的矩阵类,可做到
matrix func( matrix x , matrix y )
{
return x + y;
}

我的答案:
class Matrix
{
public:
//构造函数,根据矩阵的长和宽来创建一个矩阵
Matrix(UINT width,UINT height);
//析构函数,释放空间
~Matrix()
{
delete[] data;
}
//重载运算符,执行矩阵的加法
Matrix operator + (Matrix&,Matrix&);
//矩阵的长和宽
int width,height;
protected:
//存储矩阵数据的2维数组
int** data;
}

//构造函数
Matrix::Matrix(UINT width,UINT height)
{
this->width=width;
this->height=heigth;
//动态申请一块内存,大小为width*height*sizeof(int)
if((data=new int[width][height])==NULL)
{
//如果申请失败...
cout<<"Can't allocate memory \n";
exit(1);
}
//申请成功,执行初始化
memset(data,0,width*height*sizeof(int));
}
//重载"+"运算符
Matrix operator + (Matrix& m1,Matrix& m2)
{
//如果两个矩阵长度或宽度不一致,则不能相加,返回一个大小为0的矩阵作为失败标志
if((m1.width!=m2.width)||(m1.height!=m2.height))
return Matrix[0][0];
//两个矩阵大小一致,则创建一个大小一样的矩阵作为运算结果
Matrix m(m1.width,m1.height);
//矩阵相加
for(int i=0;i<m.width;i++)
for(int j=0;j<m.height;j++)
m[i][j]=m1[i][j]+m2[i][j];
//返回
return m;
}


人家的评价是:
您的答案看过了,但有严重的错误,当你的类对象在进行值传递时会对指针进行 bitwise方式的拷贝,导致两个对象共享同一数据区,在没有类似引用计数的机制保护之下,对象析构时必定会出错(new 了一次 delete 了两次,所以 operator = 和 拷贝构造 , 析构 是需要好好想想的)。

我C++太菜,实在不知道错在什么地方,请高手指点一下吧!谢谢!
...全文
148 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
willko 2004-11-18
  • 打赏
  • 举报
回复
请问可以这样申请内存的吗?
data=new int[width][height]
hqulyc 2004-11-18
  • 打赏
  • 举报
回复
帮你顶下!~~~~~

Matrix operator = (Matrix& x);
huowenfeng 2004-11-18
  • 打赏
  • 举报
回复
<C++Primer 3> Chapter14类的初始化赋值和析构
Azitec 2004-11-18
  • 打赏
  • 举报
回复
感谢oo

有点明白了

那么拷贝构造函数应该怎么写,才能避免bitwise方式的拷贝呢?
Flood1984 2004-11-18
  • 打赏
  • 举报
回复
重载运算符时最好声明为const,已表明不改变成员变量的值:
Matrix operator + (Matrix&,Matrix&) const;
oo 2004-11-18
  • 打赏
  • 举报
回复
//返回
return m;这里会调用拷贝构造函数,如果你不实现拷贝构造函数,
编译器会给你生成一个,但它只做bitwise方式的拷贝,效果相当于:
Matrix(const Matrix &In)
{
width = In.width;
height = In.height;
data = In.data;
}
如果这样调用 operator +
当 operator +函数返回后,里面定义的m会析构,这样data指向的内存会被释放掉,

operator +函数的返回结果Matrix object的data指向的内存是被释放了的,data变成一个野指针了。

oo 2004-11-18
  • 打赏
  • 举报
回复
需要加个拷贝构造函数,对data分配内存,拷贝数据;
否则在 + 函数里的
//返回
return m;
这里会有问题。
Azitec 2004-11-18
  • 打赏
  • 举报
回复
谢谢大家的支持

是不是要重载operator = ,或者是用拷贝构造函数呢?

哪位大哥能给一下代码?

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧