参考:
难点1:
在计算距离的时候,在Triangel类中,使用P1.dis(p2)是错误的,因为定义的Point p1是一个对象的变量,这时候不是一个对象的常量,所有没有进行转换,但是此时调用友元函数计算是可以实现的,应为友元函数只是传参的因素,同时采用 Point getPoint1()const { return p1;} 也是将常量转换为变量,这时候就可以计算了。
参考网址:https://blog.csdn.net/superinzaghi747/article/details/70175851
难点2:初始化过程中,不能访问到Point类的私有成员,所以要通过Point类中的Set成员函数完成初始化工作
项目目录:
(1)主函数main.cpp
#include "triangel.h"
#include "iostream"
using namespace std;
int main(int argc,char *argv[])
{
Point p1(0,0),p2(0,5),p3(5,0);
Triangel A(p1,p2,p3); //这是一种初始化方式 ,通过point类进行初始化
cout << "The area of triangel is:"<<A.GetArea() <<endl;
Triangel B(0,0,0,5,5,0); //这是另外一种初始化方式
cout << "The area of triangel is:"<<B.GetArea() <<endl;
return 0;
}
(2)头文件:point.h triangle.h
1.point.h
#ifndef POINT_H_INCLUDED
#define POINT_H_INCLUDED
//定义一个point类
class Point
{
public:
Point(float x=0,float y=0):x(x),y(y){} //缺省的构造函数,该函数可以表示缺省的情况,也可以表示带参数的情况
//Point(int newx,int newy):x(newx),y(newy){}; //含参数的构造函数
Point(const Point & p); //复制构造函数
~Point(){ };
//以下为成员函数
float GetX() const {return x;} //获取值
float GetY() const {return y;}
void SetX(float newx){x=newx;} //设置私有成员数据,不是构造函数,不能通过初始化成员列表进行赋值void SetX(float newx):x(newx){}
void SetY(float newy){y = newy;}
friend float dis_F( Point A , Point B) ; //通过友元函数进行计算两点距离
float dis( Point B) ; //通过成员函数计算两点距离
private:
float x,y;
};
#endif
2. triangle.h
#ifndef TRIANGLE_H_INCLUDED
#define TRIANGLE_H_INCLUDED
#include "point.h" //triangel类的成员函数类包含Point类
class Triangel
{
public:
Triangel(){}; //无参的构造函数 point自己可以初始化,调用无参的构造函数
Triangel(Point newp1,Point newp2,Point newp3):p1(newp1),p2(newp2),p3(newp3){} //含参数的构造函数
Triangel(float x1,float y1,float x2,float y2,float x3,float y3); //不通过Point类,直接进行初始化
Triangel(const Triangel & p); //复制构造函数
~Triangel(){};
//以下是成员函数
Point getPoint1() const{ return p1; }
Point getPoint2() const { return p2; }
Point getPoint3() const { return p3; }
void setPoint1( Point point1 ) { p1=point1; }
void setPoint2( Point point2 ) { p2=point2; }
void setPoint3( Point point3 ) { p3=point3; }
float GetArea()const ; //求取定义三角形的面积
private:
Point p1,p2,p3; //定义三个点
};
#endif
(3) source Files
1.point.cpp
#include "point.h"
#include "cmath"
Point::Point(const Point & p)
{
x =p.x;
y = p.y;
}
float dis_F( Point A , Point B) //友元函数
{
float disAB = sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
return disAB;
}
float Point::dis( Point B) //成员函数
{
float xx = (B.x - x)*(B.x - x);
float yy = (B.y - y)*(B.y - y);
return sqrt(xx+yy);
}
2.triangel.cpp
#include "triangel.h"
#include "cmath"
Triangel::Triangel(float x1,float y1,float x2,float y2,float x3,float y3)
{
/*这些初始化是不可以的,因为在类Triangel中是不能直接访问P1.x,除非声明是友元类
p1.x =x1;
p1.y =y1;
p2.x =x2;
p2.y = y2;
p3.x = x3;
p3.y = y3;
*/// cannot access private member declared in class 'Point'
p1.SetX(x1);
p1.SetY(y1);
p2.SetX(x2);
p2.SetY(y2);
p3.SetX(x3);
p3.SetY(y3);
}
Triangel::Triangel(const Triangel & p) //复制构造函数
{
p1 = p.p1;
p2 = p.p2;
p3 = p.p3;
}
float Triangel::GetArea() const//求取定义三角形的面积
{
//float endge1 = p1.Point::dis(p2); //这样去写为什么会报错误呢???将非常量const 转换为了常量,这时候,getPoint1()const 为什么可以???
float edge1 = getPoint1().dis(p2); //点p1到p2的距离,采用成员函数计算
float edge2 = dis_F(p2,p3); // //点p2到p3的距离,采用友元函数计算
float edge3 = getPoint3().dis(p1);
float half = (edge1+edge2+edge3)/2;
float area = sqrt(half*(half-edge1)*(half-edge2)*(half-edge3));
return area;
}