zoukankan      html  css  js  c++  java
  • 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;
    		}
    };
    
  • 相关阅读:
    单例模式
    Curator Zookeeper分布式锁
    LruCache算法原理及实现
    lombok 简化java代码注解
    Oracle客户端工具出现“Cannot access NLS data files or invalid environment specified”错误的解决办法
    解决mysql Table ‘xxx’ is marked as crashed and should be repaired的问题。
    Redis 3.0 Cluster集群配置
    分布式锁的三种实现方式
    maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令
    How to Use Convolutional Neural Networks for Time Series Classification
  • 原文地址:https://www.cnblogs.com/hzshisan/p/12571111.html
Copyright © 2011-2022 走看看