习题1

题目要求对例题12.1进行修改,将类的定义写到头文件(后缀为.h),类的成员函数声明部分写到源文件(后缀为.cpp)。
所以先打开396页看这道例题

一般每次的开头都先写的,现在只在main.cpp里写,其他的文件不用写上。

#include <iostream>
using namespace std;

因为最后其他的文件都得要包含到main函数所在的main.cpp文件里的。

相当于把以前每一个类的声明,类外成员函数的定义都独立剪切到一个文件里。

每个派生类都包含它所继承的类,最后在main.cpp文件里只需包含最终的派生类就可以了。

Ponit类

声明Point类

新建point.h 头文件

class Point   //它是基类,所以不需要包含头文件

{
public:
     Point(double a = 0, double b = 0): x(a), y(b){};
     void setPoint(double a, double b) { x = a, y = b;}
     double getX() const { return x;}
     double getY() const { return y;}
     friend ostream & operator << ( ostream &, const Point &);

 protected:
     double x;
     double y;
 };

类外定义Point类的成员函数

新建point.cpp文件

ostream & operator << ( ostream &output, const Point &p)
{
     output << "(" << p.x <<"," <<p.y <<")"<<endl;
     return output;
}

Circle类

声明Circle类

新建circle.h文件

#include "point.h"      //包含了它继承的point基类
const double pi = 3.14159; //下面算面积的时候,pi就代表这个数值

class Circle: public Point
{
public:
     Circle(double x=0, double y=0, double r=0):Point(x, y), radius(r){}
     void setRadius(double r){ radius = r ;}
     double getRadius() const { return radius;}
     double area() const { return pi * radius * radius;}
     friend ostream & operator << ( ostream &, const Circle &);
protected:
     double radius;
};

类外定义Circle类的成员函数

新建circle.cpp文件

ostream & operator << ( ostream &output, const Circle &c)
{
   output << "圆点 = (" << c.x << "," << c.y <<")" <<", r = " <<c.radius ;
   output <<", 面积 = " << c.area() <<endl;
}

Cylinder类

声明Cylinder类

新建Cylinder.h文件

#include "circle.h"  //包含了它继承的Circle类

class Cylinder : public Circle
{
public:
   Cylinder (double x, double y, double r, double h):
       Circle(x,y,r),height(h){}

   void setHeight(double h) { height = h;}
   double getHeight() { return height;}
   double area() const
   {
       return 2*Circle::area() + 2 * pi * radius * height;
   }

   double volume() const
   {
       return Circle::area() * height;
   }

   friend ostream & operator << ( ostream &, const Cylinder &);

protected:
     double height;
};

类外定义Cylinder类的成员函数

新建Cylinder.cpp文件

ostream & operator << ( ostream &output, const Cylinder &cy)
{
 output << "圆点 = (" << cy.x << "," << cy.y <<")" <<", r = " <<cy.radius;
 output << ", 表面积 =" << cy.area() << ", 体积 =" << cy.volume() <<endl;
 return output;
}

写main函数

新建main.cpp文件

#include <iostream>   //之前的做法,把类的声明和main函数都写在同一个文件,
using namespace std;  //现在只不过是把它们分开而已,所以现在得按顺序包含进来
#include "cylinder.h" //先声明类,再在类外定义成员函数,所以的一个先包含声明类的头文件
#include "point.cpp"  //类外成员函数的定义,按顺序包含进来就可以了
#include "circle.cpp"
#include "cylinder.cpp"

int main()
{
     Cylinder cy(1.0, 2.0, 3.0, 4.0);
     cout << cy ;
     cy.setPoint(2.4 , 5.9);
     cy.setRadius(13);
     cy.setHeight(14);
     cout << cy;

     Point &pRef =cy;
     cout << "点 =" << pRef<<endl;

     Circle &cRef =cy;
     cout << "圆 =" <<cRef <<endl;

     return 0;
 }

留言