神官只在景仁宫 发表于 2021-4-30 11:22:48

c++友元调用问题

#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,为啥子?该怎么改才能调用?问了周围两三个同学都没找出原因,求大佬帮助
图片中有错误的地方

lhgzbxhz 发表于 2021-4-30 11:22:49

首先,point::distance函数应该定义为static,因为distance()函数必须通过point类的实例对象才能访问
其次,你在distance()函数内调用a和b干什么?它们是Circle类的成员变量,要通过Circle类的对象才能访问,直接访问当然不行了

神官只在景仁宫 发表于 2021-4-30 11:27:40

图片在这

神官只在景仁宫 发表于 2021-5-6 15:58:17

lhgzbxhz 发表于 2021-5-1 09:48
首先,point::distance函数应该定义为static,因为distance()函数必须通过point类的实例对象才能访问
其次 ...

好嘞,但是我声明了distance为circle类的友元,它调用不了circle类的对象a,b的嘛?

lhgzbxhz 发表于 2021-5-6 18:46:05

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

对象的成员必须先有对象才能调用的啊,你distance()函数里连对象都没有,上哪调用成员a,b去?

神官只在景仁宫 发表于 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;

}
改进后的函数,友元函数调用需要类的对象

神官只在景仁宫 发表于 2021-5-9 17:08:10

lhgzbxhz 发表于 2021-5-6 18:46
对象的成员必须先有对象才能调用的啊,你distance()函数里连对象都没有,上哪调用成员a,b去?

明白了,谢谢啦
页: [1]
查看完整版本: c++友元调用问题