//普通函式作為一個類(或多個類)的友元函式
#include<iostream>
#include<math.h>
using namespace std;
//point類定義和實施
class point1
{
private:
double x,y;//定義私有變數
public:
point1 (double x=0.0,double y=0.0);//宣告建構式
void disp();//宣告輸出函式
friend double distance(point1 p1,point1 p2);//宣告point的友元函式(及不是point類的成員函式,但是可以呼叫該類的私有或公有成員)
};
point1::point1(double x,double y)//定義建構式,*注意有作用域符號
{
this->x=x;this->y=y;
}
void point1::disp()//定義輸出函式,注意有作用域符號*
{
cout<<"點("<<x<<","<<y<<")";
}
//直線類的定義
class line
{
private:
double a,b,c;
public:
line(double a=0.0,double b=0.0,double c=0.0);
void disp();
friend double distance(point1 p,line l);
friend double distance(line p1,line p2);
};
line::line(double a,double b,double c)
{
this->a=a;this->b=b;this->c=c;
}
void line::disp()
{
cout<<"線:"<<a<<"x+"<<b<<"y+"<<c<<"=0";
}
double distance(point1 p1,point1 p2)//定義友元函式,沒有作用域符號
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));//友元函式可以直接訪問該類的所有物件的私有或公有成員
}
double distance(point1 p,line l)
{
return fabs((p.x*l.a+p.y*l.b+l.c)/sqrt(l.a*l.a+l.b*l.b));
}
//main函式
int main()
{
point1 p1(0.0,0.0);
point1 p2(2.0,1.0);
line a1(1.0,2.0,3.0);
line a2(2.0,3.0,1.0);
p1.disp();
p2.disp();
a1.disp();
a2.disp();
cout<<"點到直線的距離是:"<<distance( p1,a2)<<endl;
cout<<"兩點之間的距離是:"<<distance(p1,p2)<<endl;
return 0;
}
請問我的代碼是有什么問題嗎,編譯時顯示 within this context,???
uj5u.com熱心網友回復:
一個基本概念錯,在你的函式double distance(point1 p, line l)
{
return fabs((p.x * l.a + p.y * l.b + l.c) / sqrt(l.a * l.a + l.b * l.b));
}
中,
p.x,p.y都是私有變數,不能直接訪問的
要么你將該函式放入類中,要么定義x,y為public的
當然,你也可以定義二個公有的函式要得到x,y的值
uj5u.com熱心網友回復:
double distance(point1 p1,point1 p2)訪問point1的私有成員是可以的,但是double distance(point1 p,line l)訪問point1的私有成員則不行,因為它只是line的友元函式,不是point1的友元函式。
解決方法:
class line;
class point1
{
private:
double x,y;//定義私有變數
public:
point1 (double x=0.0,double y=0.0);//宣告建構式
void disp();//宣告輸出函式
friend double distance(point1 p1,point1 p2);//宣告point的友元函式(及不是point類的成員函式,但是可以呼叫該類的私有或公有成員)
friend double distance(point1 p,line l);
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/64522.html
標籤:基礎類
上一篇:為什么代碼沒打錯卻不能編譯運行?
