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;
}
};