c++中,在一个类中参数传递中出现的一个问题

设计一个类CRectangle,除了有关的数据成员外,该类还要求包含下述成员函数:矩形从一个位置移动到另外一个位置的Move()函数,改变矩形大小的Size()函数,返回... 设计一个类CRectangle,除了有关的数据成员外,该类还要求包含下述成员函数:矩形从一个位置移动到另外一个位置的Move()函数,改变矩形大小的Size()函数,返回矩形左上角的坐标的Where()函数,计算矩形面积的Area()函数。

我写这个程序的思路是:
Move()函数是把矩形整体移动。
Size()函数是把左上角和右下角两个坐标向外移动。比如左上角坐标和右下角坐标分别是(1,1),(2,0),那么利用Size()函数中的两个参数 1 1 以后,就变成(0,2),(3,-1)。
Where()函数是把左上角的坐标输出来。

在主函数中,首先输入矩形的两个角落的坐标,然后在此基础上移动,而原来的坐标是不改变的。
然后在调用了改变矩形大小的Size()函数(这个函数中两个角落的坐标还是原来的坐标),但是...........我输入了两个参数给Size()函数以后,问题就出现了。问题是输出的时候横坐标和纵坐标的位置颠倒了,而且横坐标的值变成了0,但是纵坐标的值却是利用参数改变了以后的值。所以后面的Area()函数也就跟着出现了错误(我的意愿是Area()函数是计算我改变矩形大小以后的面积,不是原来矩形的面积)。
void CRectangle::Size(double X,double Y)
{
p1=((p1.getx()-X),(p1.gety()+Y)); //有问题的地方
p2=((p2.getx()+X),(p2.gety()-Y)); //由问题的地方
cout<<"改变矩形的大小后:"<<endl;
cout<<"矩形左上角的坐标变为:"<<"("<<p1.getx()<<","<<p1.gety()<<")"<<endl;
cout<<"矩形右下角的坐标变为:"<<"("<<p2.getx()<<","<<p2.gety()<<")"<<endl;
}

恳请哪位高手指点一下,我是C++初学者。谢谢了....
#include<iostream>
using namespace std;
class Point
{
double x,y;
public:
Point(double x=0,double y=0):x(x),y(y){}
~Point(){cout<<"析构掉Point对象!"<<endl;}
double getx(){return x;}
double gety(){return y;}
};
class CRectangle
{
Point p1,p2;
public:
CRectangle(Point px=0,Point py=0):p1(px),p2(py){}
~CRectangle(){cout<<"析构掉CRectangle对象!"<<endl;}
void Move(double xx,double yy);
void Size(double X,double Y);
void Where();
void Area();
};
void CRectangle::Move(double xx,double yy)
{
double X1=p1.getx()+xx;
double Y1=p1.gety()+yy;
double X2=p2.getx()+xx;
double Y2=p2.gety()+yy;
cout<<"矩形左上角的坐标由"<<"("<<p1.getx()<<","<<p1.gety()<<")"<<"移动到"<<"("<<X1<<","<<Y1<<")"<<endl;
cout<<"矩形右下角的坐标由"<<"("<<p2.getx()<<","<<p2.gety()<<")"<<"移动到"<<"("<<X2<<","<<Y2<<")"<<endl;
p1=((p1.getx()+xx),(p1.gety()+yy));
p2=((p2.getx()+xx),(p2.gety()+yy));
}
展开
 我来答
raidy_liu
推荐于2016-04-10 · TA获得超过915个赞
知道小有建树答主
回答量:153
采纳率:0%
帮助的人:186万
展开全部
你程序的问题出在于:
p1=((p1.getx()-X),(p1.gety()+Y)); //有问题的地方
p2=((p2.getx()+X),(p2.gety()-Y)); //由问题的地方
因为你没有重载Point类的赋值函数,执行 p1=((p1.getx()-X),(p1.gety()+Y));时,会进行复制构造函数的操作,也就是说系统会现调用构造函数生成一个临时变量(是具体编译平台,有些不生成临时变量),再将临时变量赋给P1,这里执行过程中出错了。
解决方法1:
将 p1=((p1.getx()-X),(p1.gety()+Y)); //有问题的地方
改成:
double x_val,y_val;
x_val=p1.getx();
y_val=p1.gety();
Point pTemp(x_val-X,y_val-Y);
p1=pTemp;
解决方法2:
写个Point赋值的重载函数。
void operator()(double x1,double y1)
{
x=x1;
y=y1;
}
将 p1=((p1.getx()-X),(p1.gety()+Y)); //有问题的地方
改成:
p1((p1.getx()-X),(p1.gety()+Y));
百度网友96aa8d3
2011-03-13 · TA获得超过433个赞
知道小有建树答主
回答量:2306
采纳率:75%
帮助的人:937万
展开全部
确定矩形是俩个点 左上点 和右下点, 所以只要记下俩个点,
然后考虑move 的话 你移动的是一个向量,你可以将向量分为x,y
这样就可以了

然后我给你弄个变大的问题吧,要知道 必须是在中心点 保持不变的情况下 长和宽 变大

具体的倍数 自己算
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hu0839
2011-03-13
知道答主
回答量:8
采纳率:0%
帮助的人:0
展开全部
p1,p2 是什么呀,在哪定义的,是在一起定义的不。看你代码就知道你是C++初学者,
我猜是你类的成员变量。其它地方还有定义不
追问
{
flag=0;
Point pp1(xx1,yy1),pp2(xx2,yy2);
CRectangle C(pp1,pp2);
C.Area();
cout>a>>b;
C.Move(a,b);
cout>a1>>b1;
C.Size(a1,b1);
C.Where();
C.Area();
}
}
}
追答
这样 看不到问题。问题不在你的调用上,要看你的类 怎么实现,才知道呀,你把代码发给我,我给看看,多半也能给你搞定,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
PFanAya
2011-03-12 · TA获得超过243个赞
知道小有建树答主
回答量:188
采纳率:0%
帮助的人:232万
展开全部
把全部代码贴上来吧
追问
void CRectangle::Where()
{
cout<<"矩形的左上角坐标为:"<<"("<<p1.getx()<<","<<p1.gety()<<")"<<endl;
}
void CRectangle::Area()
{
double len=p1.gety()-p2.gety();
double wid=p2.getx()-p1.getx();
double S=len*wid;
cout<<"矩形的面积是:"<<S<<endl;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
alilang0302
2011-03-12 · 超过10用户采纳过TA的回答
知道答主
回答量:25
采纳率:0%
帮助的人:25.6万
展开全部
应该是operator=重载有问题
追问
void main()
{
double xx1,yy1,xx2,yy2,a,b,a1,b1;
int flag=1;
cout>xx1>>yy1>>xx2>>yy2;
if(xx1==xx2||yy1==yy2)
coutxx2||yy1<yy2)
cout<<"输入错误!"<<endl;
else
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式