鱼C论坛

 找回密码
 立即注册
查看: 104|回复: 6

[已解决]c++友元调用问题

[复制链接]
发表于 2021-4-30 11:22:48 | 显示全部楼层 |阅读模式
10鱼币
  1. #include<iostream>
  2. #include<math.h>
  3. #define PI 3.14
  4. using namespace std;
  5. class point
  6. {
  7. public:
  8. double distance(int c,int d);
  9. };
  10. class Circle
  11. {
  12. public:
  13. int r,s,a,b;
  14. Circle();
  15. ~Circle();
  16. void cla();
  17. void location(int c,int d);
  18. friend double point::distance(int c,int d);


  19. };

  20. Circle::Circle ()
  21. {
  22. r=3;
  23. a=0;
  24. b=0;
  25. cout<<"该圆的坐标为"<<a<<","<<b<<"\n"<<endl;
  26. cout<<"该圆的半径为"<<r<<endl;
  27. }
  28. Circle::~Circle(){}
  29. double point::distance(int c,int d)
  30. {
  31. int p;
  32. p=sqrt((c-a)*(c-a)+(d-b)*(d-b));
  33. return p;
  34. }
  35. void Circle::cla()

  36. {
  37. s=2*PI*r*r;
  38. cout<<"该圆的面积为"<<s<<"\n"<<endl;
  39. }
  40. void Circle::location(int c,int d)

  41. {
  42. int L;
  43. L=(a-c)*(a-c)+(b-d)*(b-d);
  44. if(L>r*r)
  45. {
  46.   std::cout<<"该点位于圆外\n"<<endl;
  47. }
  48. if(L<r*r)
  49. {
  50.   std::cout<<"该点位于圆内\n"<<endl;
  51. }
  52. if(L=r*r)
  53. {
  54.   std::cout<<"该点位于圆上\n"<<endl;
  55. }
  56. }
  57. int main()
  58. {
  59. int c,d,m;
  60. cout<<"input two point"<<endl;
  61. cin>>c>>d;
  62. Circle cir1;
  63. cir1.cla();
  64. cir1.location(c,d);
  65. m=distance(c,d);
  66. cout<<"该点到圆心的距离为:"<<m;
  67. return 0;

  68. }
复制代码

point这个函数是circle类的友元函数,a,b在circle内设为了public的,但point还是调用不了circle中的a,b,为啥子?该怎么改才能调用?问了周围两三个同学都没找出原因,求大佬帮助
图片中有错误的地方
最佳答案
2021-4-30 11:22:49
首先,point::distance函数应该定义为static,因为distance()函数必须通过point类的实例对象才能访问
其次,你在distance()函数内调用a和b干什么?它们是Circle类的成员变量,要通过Circle类的对象才能访问,直接访问当然不行了

最佳答案

查看完整内容

首先,point::distance函数应该定义为static,因为distance()函数必须通过point类的实例对象才能访问 其次,你在distance()函数内调用a和b干什么?它们是Circle类的成员变量,要通过Circle类的对象才能访问,直接访问当然不行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-4-30 11:22:49 | 显示全部楼层    本楼为最佳答案   
首先,point::distance函数应该定义为static,因为distance()函数必须通过point类的实例对象才能访问
其次,你在distance()函数内调用a和b干什么?它们是Circle类的成员变量,要通过Circle类的对象才能访问,直接访问当然不行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-4-30 11:27:40 | 显示全部楼层
图片在这
问题1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 7 天前 | 显示全部楼层
lhgzbxhz 发表于 2021-5-1 09:48
首先,point::distance函数应该定义为static,因为distance()函数必须通过point类的实例对象才能访问
其次 ...

好嘞,但是我声明了distance为circle类的友元,它调用不了circle类的对象a,b的嘛?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 7 天前 | 显示全部楼层
神官只在景仁宫 发表于 2021-5-6 15:58
好嘞,但是我声明了distance为circle类的友元,它调用不了circle类的对象a,b的嘛?

对象的成员必须先有对象才能调用的啊,你distance()函数里连对象都没有,上哪调用成员a,b去?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 4 天前 | 显示全部楼层
  1. #include<iostream>
  2. #include<math.h>
  3. #define PI 3.14
  4. using namespace std;
  5. class Circle;
  6. class point
  7. {
  8.     public:
  9. double distance(Circle cir1);
  10. point(int x,int y){c=x;d=y;}
  11. int c,d;
  12. };
  13. class Circle
  14. {
  15. public:
  16. int r,s;
  17. Circle();
  18. ~Circle();
  19. void cla();
  20. void location(int c,int d);
  21. friend double point::distance(Circle cir1);
  22. private:
  23.     int a,b;
  24. };

  25. Circle::Circle ()
  26. {
  27. r=3;
  28. a=0;
  29. b=0;
  30. cout<<"该圆的坐标为("<<a<<","<<b<<")\n"<<endl;
  31. cout<<"该圆的半径为"<<r<<endl;
  32. }
  33. Circle::~Circle(){}
  34. double point::distance(Circle cir1)
  35. {
  36. int p;
  37. p=sqrt((c-cir1.a)*(c-cir1.a)+(d-cir1.b)*(d-cir1.b));
  38. return p;
  39. }
  40. void Circle::cla()

  41. {
  42. s=2*PI*r*r;
  43. cout<<"该圆的面积为"<<s<<"\n"<<endl;
  44. }
  45. void Circle::location(int c,int d)

  46. {
  47. int L;
  48. L=(a-c)*(a-c)+(b-d)*(b-d);
  49. if(L>r*r)
  50. {
  51.   std::cout<<"该点位于圆外\n"<<endl;
  52. }
  53. if(L<r*r)
  54. {
  55.   std::cout<<"该点位于圆内\n"<<endl;
  56. }
  57. if(L=r*r)
  58. {
  59.   std::cout<<"该点位于圆上\n"<<endl;
  60. }
  61. }
  62. int main()
  63. {
  64. int c,d,m;
  65. Circle cir1;
  66. cir1.cla();
  67. cout<<"输入该点的两个坐标"<<endl;
  68. cin>>c>>d;
  69. point P(c,d);
  70. cir1.location(c,d);
  71. m=P.distance(cir1);
  72. cout<<"该点到圆心的距离为:"<<m;
  73. return 0;

  74. }
复制代码

改进后的函数,友元函数调用需要类的对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 4 天前 | 显示全部楼层
lhgzbxhz 发表于 2021-5-6 18:46
对象的成员必须先有对象才能调用的啊,你distance()函数里连对象都没有,上哪调用成员a,b去?

明白了,谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2021-5-13 01:15

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表