8.1 线段类设计与实现-类组合

要求在Point类基础上采用类组合的思想,设计一个线段类,如图所示,线段类包括2个点类对象,成员函数能显示该线段的起点坐标、终点坐标以及线段的长度。2个点坐标从键盘输入,线段长度通过公式计算。
在学习过封装后,我们要学会将类进行组合,如何进行组合呢?
首先我们将类区分为两种,一种是被引用的,另一种是需要引用前一类中某些数据项或者成员函数的,为了方便下面讲解,在这里我将他们分别命名为提供类和需求类
重点就在于需求类中的操作
首先就要声明提供类作为数据成员
比如我用Circle类需要Point类中的某些成员
那么在Circle类中除了要声明double型的半径r 还要声明Circle型的 c1
请看例题

前置代码::

#include <iostream>
#include <cmath>
using namespace std;
class Point//点类定义
{
private:
	double x,y;//点坐标
public:
	Point(double i,double j)//带参数的构造函数
	{
		x=i;
		y=j;
		cout<<"Point类的带参数构造函数被调用"<<endl;
	}
	Point()//无参构造函数
	{
		x=0;
		y=0;
		cout<<"Point类的无参构造函数被调用"<<endl;
	}
	Point(Point &p)//拷贝构造函数
	{
		x=p.x;
		y=p.y;
		cout<<"Point类的拷贝构造函数被调用"<<endl;
	}
	double getx()
	{
		return x;
	}
    double gety()
	{
		return y;
	}
	void Show()
	{
		cout<<"("<<x<<","<<y<<")"<<endl;
	}
};

后置代码::

int main()
{
   Point p1(100,100),p2(200,300);
   Line xd1(p1,p2);
   xd1.Show();   
   Line xd2(100,100,200,300);
   xd2.Show();
   return 0;
}

要求,设计出Line类使得输出满足如下情况

Point类的带参数构造函数被调用↵
Point类的带参数构造函数被调用↵
Point类的拷贝构造函数被调用↵
Point类的拷贝构造函数被调用↵
Line类的有参构造函数1被调用↵
start=(100,100)↵
end=(200,300)↵
length=223.607↵
Point类的带参数构造函数被调用↵
Point类的带参数构造函数被调用↵
Line类的有参构造函数2被调用↵
start=(100,100)↵
end=(200,300)↵
length=223.607↵

下面按照开始提示的进行Line类的编写

class Line
{
	private:
		Point p1,p2;
		double r;
	public:
	    Line(Point &p1,Point &p2) :p1(p1),p2(p2)
	    {//这个就是两种不同的输入形式导致的下一种是直接 输入数值,这种是输入类 
	    	r=sqrt((p2.getx()-p1.getx())*(p2.getx()-p1.getx())+(p2.gety()-p1.gety())*(p2.gety()-p1.gety()));
	    	cout<<"Line类的有参构造函数1被调用"<<endl;
		}
		Line(double a,double b,double c,double d) :p1(a,b),p2(c,d)//这里很值得注意 有些类似于赋值,区别就在于这是类组合的赋值 
		{
			r=sqrt((p2.getx()-p1.getx())*(p2.getx()-p1.getx())+(p2.gety()-p1.gety())*(p2.gety()-p1.gety()));
			//这个是计算两点间 的距离公式 
			cout<<"Line类的有参构造函数2被调用"<<endl;
		}
		void Show()
		{
			cout<<"start=("<<p1.getx()<<","<<p1.gety()<<")"<<endl;
			cout<<"end=("<<p2.getx()<<","<<p2.gety()<<")"<<endl;
			cout<<"length="<<r<<endl;
		}
};
原文地址:https://www.cnblogs.com/hzshisan/p/12571111.html