鱼C论坛

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

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

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

 
};

Circle::Circle ()
{ 
 r=3;
 a=0;
 b=0;
 cout<<"该圆的坐标为"<<a<<","<<b<<"\n"<<endl;
 cout<<"该圆的半径为"<<r<<endl;
}
Circle::~Circle(){}
double point::distance(int c,int d)
{
 int p;
 p=sqrt((c-a)*(c-a)+(d-b)*(d-b));
 return p;
}
void Circle::cla()

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

{
 int L;
 L=(a-c)*(a-c)+(b-d)*(b-d);
 if(L>r*r)
 {
  std::cout<<"该点位于圆外\n"<<endl;
 }
 if(L<r*r)
 {
  std::cout<<"该点位于圆内\n"<<endl;
 }
 if(L=r*r)
 {
  std::cout<<"该点位于圆上\n"<<endl;
 }
}
int main()
{
 int c,d,m;
 cout<<"input two point"<<endl;
 cin>>c>>d;
 Circle cir1;
 cir1.cla();
 cir1.location(c,d);
 m=distance(c,d);
 cout<<"该点到圆心的距离为:"<<m;
 return 0;
 
}
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
回复

使用道具 举报

 楼主| 发表于 2021-5-6 15:58:17 | 显示全部楼层
lhgzbxhz 发表于 2021-5-1 09:48
首先,point::distance函数应该定义为static,因为distance()函数必须通过point类的实例对象才能访问
其次 ...

好嘞,但是我声明了distance为circle类的友元,它调用不了circle类的对象a,b的嘛?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-6 18:46:05 | 显示全部楼层
神官只在景仁宫 发表于 2021-5-6 15:58
好嘞,但是我声明了distance为circle类的友元,它调用不了circle类的对象a,b的嘛?

对象的成员必须先有对象才能调用的啊,你distance()函数里连对象都没有,上哪调用成员a,b去?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-9 17:07:35 | 显示全部楼层
#include<iostream>
#include<math.h>
#define PI 3.14
using namespace std;
class Circle;
class point
{
    public:
 double distance(Circle cir1);
 point(int x,int y){c=x;d=y;}
 int c,d;
};
class Circle
{
public:
 int r,s;
 Circle();
 ~Circle();
 void cla();
 void location(int c,int d);
 friend double point::distance(Circle cir1);
private:
    int a,b;
};

Circle::Circle ()
{
 r=3;
 a=0;
 b=0;
 cout<<"该圆的坐标为("<<a<<","<<b<<")\n"<<endl;
 cout<<"该圆的半径为"<<r<<endl;
}
Circle::~Circle(){}
double point::distance(Circle cir1)
{
 int p;
 p=sqrt((c-cir1.a)*(c-cir1.a)+(d-cir1.b)*(d-cir1.b));
 return p;
}
void Circle::cla()

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

{
 int L;
 L=(a-c)*(a-c)+(b-d)*(b-d);
 if(L>r*r)
 {
  std::cout<<"该点位于圆外\n"<<endl;
 }
 if(L<r*r)
 {
  std::cout<<"该点位于圆内\n"<<endl;
 }
 if(L=r*r)
 {
  std::cout<<"该点位于圆上\n"<<endl;
 }
}
int main()
{
 int c,d,m;
 Circle cir1;
 cir1.cla();
 cout<<"输入该点的两个坐标"<<endl;
 cin>>c>>d;
 point P(c,d);
 cir1.location(c,d);
 m=P.distance(cir1);
 cout<<"该点到圆心的距离为:"<<m;
 return 0;

}
改进后的函数,友元函数调用需要类的对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-9 17:08:10 | 显示全部楼层
lhgzbxhz 发表于 2021-5-6 18:46
对象的成员必须先有对象才能调用的啊,你distance()函数里连对象都没有,上哪调用成员a,b去?

明白了,谢谢啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-15 17:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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