通过Point类和Triangel类实现三角形面积的计算

参考:

                                      

难点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;

}

猜你喜欢

转载自blog.csdn.net/haoaoweitt/article/details/81326062