读书人

一个小弟我研究了很多天却不能解决的

发布时间: 2012-03-03 15:33:03 作者: rapoo

一个我研究了很多天,却不能解决的问题!关于不等二维数组之间的赋值(使用运算符重载)
下面是源代码,用vc6.0编译通过,但运行时总是提示赋值操作有问题(我用运算符重载实现的)!
首先是头文件
#ifndef ARRAY_H
#define ARRAY_H


#include <iostream.h>


class DoubleSubscriptedArray
{

friend ostream &operator < < (ostream &, const DoubleSubscriptedArray &);
friend istream &operator> > (istream &, DoubleSubscriptedArray &);


int **ptr;

int size;
int y;
int x;


public:
DoubleSubscriptedArray( int , int );

~DoubleSubscriptedArray();
int access(int ,int) const;
const DoubleSubscriptedArray &operator= (const DoubleSubscriptedArray &);
int operator== (const DoubleSubscriptedArray &) const;
int operator!= (const DoubleSubscriptedArray &) const;
int &operator [] (int);



};


#endif

//然后是函数的定义部分
//注意:重载的=有问题,关键问题就在 重载的‘=’上。

#include <iostream.h>
#include <stdlib.h>
#include <assert.h>
#include "array.h "


DoubleSubscriptedArray:: DoubleSubscriptedArray(int m,int n)
{
x=m;
y=n;
size =x*y;



ptr=new int *[x];
for(int j=0;j <y;j++)
ptr[j]=new int[y];

/* assert(ptr!=0);
for(int k=0;k <m;k++)
for(int l=0;l <n;l++)
ptr [k][l] =0;
*/



}


DoubleSubscriptedArray::~DoubleSubscriptedArray()
{
for(int h =0; h < x; h++)
delete []ptr[h];
delete []ptr;


}

int DoubleSubscriptedArray:: access(int a,int b) const
{

return ptr[a][b];

}

int DoubleSubscriptedArray:: operator== (const DoubleSubscriptedArray &right) const
{

if(size!=right.size || x!=right.x || y!=right.y)
return 0;

for(int i=0;i <x;i++)
for(int j=0;j <y;j++)
if(ptr[i][j] != right.ptr[i][j])
return 0;

return 1;

}

int DoubleSubscriptedArray::operator != (const DoubleSubscriptedArray &right) const
{
if(size!=right.size || x!=right.x || y!=right.y)


return 1;

for (int i=0;i <x;i++)
for(int j=0; j <y; j++)
if(ptr[i][j]!= right.ptr[i][j])
return 1;

return 0;

}

//问题基本上出在这块里面:
//我苦想研究了许多天也没有解决

const DoubleSubscriptedArray &DoubleSubscriptedArray:: operator= (const DoubleSubscriptedArray &right)
{
if(&right!= this) {
for(int h =0; h < x; h++)
delete [] ptr[h];
delete [] ptr;

x=right.x;
y=right.y;

ptr=new int*[right.x];
for(int k=0; k <right.x; k++)
ptr[k] = new int[right.y];


//assert(ptr!=0);

for(int i=0;i <x;i++)
for(int j=0;j <y;j++)

ptr[i][j] = right.ptr[i][j];
}

return *this;

}


istream &operator> > (istream &input, DoubleSubscriptedArray &a)
{
for(int i=0;i <a.x;i++)
for(int j=0;j <a.y;j++)
input> > a.ptr[i][j];
return input;
}

ostream &operator < < (ostream &output, const DoubleSubscriptedArray &a)
{
for(int i=0;i <a.x;i++)
for(int j=0;j <a.y;j++)
{
output < <a.ptr[i][j] < < ' ';

if(j==(a.y-1))
output < <endl < < " ";
}


return output;

}

//下面就是测试主程序啦
//大家看看!


#include <iostream.h>
#include "array.h "


void main()
{
DoubleSubscriptedArray a1(2,3),a2(2,2);
cout < < "input 10 intgers " < <endl;
cin> > a1> > a2;
cout < < "a1: " < <a1 < <endl;
cout < < "a2: " < <a2 < <endl;
cout < < "a2(0,0)= " < <a2.access(0,0) < <endl;
if(a1!=a2)
cout < < "the are not equal! " < <endl;

a1=a2;
cout < < "a1: " < <a1 < <endl;
cout < < "a2: " < <a2 < <endl;
if(a1==a2)
cout < < "the are equal! " < <endl;


}

各位兄弟,可以将代码运行检查一下,我研究一周!我实在没有办法弄出问题在哪里?
跪求高手!必将分送给解答正确的那位!


[解决办法]
const DoubleSubscriptedArray &operator= (const DoubleSubscriptedArray &);



改成

DoubleSubscriptedArray & operator= (const DoubleSubscriptedArray &);
[解决办法]
在 operator= 中:

x=right.x;
y=right.y;
size=right.size; //增加这个语句
[解决办法]
否则,在operator== 中
if(size!=right.size || x!=right.x || y!=right.y)

第一个条件分支就不会成立
(除非一开始就是 == 的)
[解决办法]
我觉得 size 的概念用成员函数来表达更合适。

int DoubleSubscriptedArray::size() const {
return x * y;
}
[解决办法]
class DoubleSubscriptedArray
{
.......

const DoubleSubscriptedArray &operator= (const DoubleSubscriptedArray &);

////////====> DoubleSubscriptedArray &operator= (const DoubleSubscriptedArray &);
......................

};
.............
DoubleSubscriptedArray:: DoubleSubscriptedArray(int m,int n)
{
x=m;
y=n;
size =x*y;

ptr=new int *[x];
for(int j=0;j <y;j++) //////=====> for (int j=0; j <x; ++j)
ptr[j]=new int[y];
...........................
}

const DoubleSubscriptedArray &DoubleSubscriptedArray:: operator=
/////====> DoubleSubscriptedArray &DoubleSubscriptedArray:: operator=
(const DoubleSubscriptedArray &right)
{
if(&right!= this) {
for(int h =0; h < x; h++)
delete [] ptr[h];
delete [] ptr;

x=right.x;
y=right.y;

//////====> size = rhs.size;
.............


}

读书人网 >C++

热点推荐