• 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;
    		}
    };
    
  • 相关阅读:
    Android启动过程介绍
    第九届蓝桥杯Java B组
    二分模板和区别
    第十届蓝桥杯Java B组
    2019 ICPC Asia Nanjing Regional(现场赛)
    PAT 甲级 1057 Stack
    P1972 [SDOI2009]HH的项链
    Python中的字典排序
    Comet OJ
    ekmp模板
  • 原文地址:https://www.cnblogs.com/hzshisan/p/12571111.html
Copyright © 2020-2023  润新知