| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1705 人关注过本帖
标题:运算符重载问题
只看楼主 加入收藏
三少爷
Rank: 1
等 级:新手上路
帖 子:192
专家分:0
注 册:2004-4-29
收藏
 问题点数:0 回复次数:13 
运算符重载问题

以下是一个输入三点判断并求三角形面积的程序

可能是运算符>>重载的问题,哪位能帮忙指点一下。

#include<iostream> #include<cstdlib> #include<cmath> using namespace std; class point { private: double x,y; public: point(double xx=0,double yy=0){x=xx;y=yy;} friend void triangle(point &,point &,point &); friend istream &operator>>(istream &,point &); }; void triangle(point &p1,point &p2,point &p3) { double k=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)), l=sqrt((p1.x-p3.x)*(p1.x-p3.x)+(p1.y-p3.y)*(p1.y-p3.y)), s=sqrt((p3.x-p2.x)*(p3.x-p2.x)+(p3.y-p2.y)*(p3.y-p2.y)); if(k+l>s && k-l<s) { double m=(k*k+l*l-s*s)/(2*k*l); //这里应该注意一下,一定要括号 cout<<"能构成三角形,面积为:"<<0.5*k*l*sqrt(1-m*m)<<endl; } else cout<<"不能构成三角形"<<endl; } istream &operator>>(istream &input,point &p) { cin>>p.x>>p.y; return input; } int main() { point p1,p2,p3; cout<<"请输入三个点:"; cin>>p1>>p2>>p3; triangle(p1,p2,p3); system("pause"); }

搜索更多相关主题的帖子: 运算符 重载 
2004-12-26 11:44
renyihehe
Rank: 1
等 级:新手上路
帖 子:52
专家分:0
注 册:2004-12-19
收藏
得分:0 

试了一下,好像你那个point的类中,x和y不能设为私有,因为你后面用的cin>>p.x>>p.y,改成共有的,好像可以用了。

我用vc调试的,改过就好了!

2004-12-26 15:33
三少爷
Rank: 1
等 级:新手上路
帖 子:192
专家分:0
注 册:2004-4-29
收藏
得分:0 
程序原本的规则是通过运算符重载来实现对私有数据的访问

2004-12-27 13:21
renyihehe
Rank: 1
等 级:新手上路
帖 子:52
专家分:0
注 册:2004-12-19
收藏
得分:0 

那我也不知道,我对这个还不了解呢,只是调试的时候试了一下,发现程序能运行了。

我也是很迷惑呀,应该说通过友元可以访问类的私有成员的呀。

可惜没有大大出来说说!

2004-12-27 16:48
volte
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:69
帖 子:1167
专家分:1316
注 册:2004-12-19
收藏
得分:0 

你有没有注意到你这里用到的是引用。

引用时候访问成员时只注意访问的类型。

也就是说它只知道返回的是Point 类

而并不需要知道其对象。

所以你的重载有问题。


大家都是朋友,有空就来坐坐!
2004-12-27 21:03
volte
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:69
帖 子:1167
专家分:1316
注 册:2004-12-19
收藏
得分:0 

friend istream& operator>>( istream &io, point &s ) { double inBuf; io>>inBuf; s.x = inBuf; io>>inBuf; s.y=inBuf; return io; }

你试一下,我只是凭感觉给你改的。


大家都是朋友,有空就来坐坐!
2004-12-27 22:24
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

#include<iostream> #include<cstdlib> #include<cmath> using namespace std;

class point { private: double x,y; public: point(double xx=0,double yy=0){x=xx;y=yy;} friend void triangle(point &,point &,point &); friend istream &operator>>(istream &,point &); };

void triangle(point &p1,point &p2,point &p3) { double k=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); double l=sqrt((p1.x-p3.x)*(p1.x-p3.x)+(p1.y-p3.y)*(p1.y-p3.y)); double s=sqrt((p3.x-p2.x)*(p3.x-p2.x)+(p3.y-p2.y)*(p3.y-p2.y)); if(k+l>s && k-l<s) { double m=(k*k+l*l-s*s)/(2*k*l); //ÕâÀïÓ¦¸Ã×¢Òâһϣ¬Ò»¶¨ÒªÀ¨ºÅ cout<<"Äܹ¹³ÉÈý½ÇÐΣ¬Ãæ»ýΪ£º"<<0.5*k*l*sqrt(1-m*m)<<endl; } else cout<<"²»Äܹ¹³ÉÈý½ÇÐÎ"<<endl; } istream &operator>>(istream &input,point &p) { input>>p.x>>p.y; // here is an error, instead of cin, you should set the parameter input as istream object return input; }

int main() { point p1,p2,p3; cout<<"ÇëÊäÈëÈý¸öµã£º"; cin>>p1>>p2>>p3; triangle(p1,p2,p3); system("pause");

return 0; }


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-12-28 00:18
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

// 你的关于计算面积的算法也有问题,我将程序修改如下:

void triangle(point &p1,point &p2,point &p3) { double p1_p2=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); double p1_p3=sqrt((p1.x-p3.x)*(p1.x-p3.x)+(p1.y-p3.y)*(p1.y-p3.y)); double p2_p3=sqrt((p3.x-p2.x)*(p3.x-p2.x)+(p3.y-p2.y)*(p3.y-p2.y));

double max; max = (p1_p2>p1_p3)?p1_p2:p1_p3; max = (max>p2_p3)?max:p2_p3;

double g = 0.000001; if((p1_p2 + p1_p3 + p2_p3 - 2*max)>g) { double m=(p1_p2*p1_p2+p1_p3*p1_p3-p2_p3*p2_p3)/(2*p1_p2*p1_p3); cout<<"It can be a triangle with the area: " <<0.5*p1_p2*p1_p3*sqrt(1-m*m)<<endl; } else cout<<"It can not be triangle"<<endl; }


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-12-28 01:21
renyihehe
Rank: 1
等 级:新手上路
帖 子:52
专家分:0
注 册:2004-12-19
收藏
得分:0 
以下是引用volte在2004-12-27 22:24:45的发言:

friend istream& operator>>( istream &io, point &s ) { double inBuf; io>>inBuf; s.x = inBuf; io>>inBuf; s.y=inBuf; return io; }

你试一下,我只是凭感觉给你改的。

只是改这一个地方么?好像不行呀。

2004-12-28 11:58
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
volte, 你6楼的代码完全正确,不过那个辅助变量inBuf 有点多此一举。也就是说,你的代码完全可以写成以下形式:

friend istream& operator>>( istream &io, point &s ) { io>>s.x>>s.y; return io; }


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-12-28 12:42
快速回复:运算符重载问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013268 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved