1. 程式人生 > >習題 12.1 在例12.1程式基礎上作一些修改。定義Point類,由Point類派生出Circle類,再由Circle類派生出Cylinder類。將類的定義部分分別作為3個頭檔案,對它們的成員。。。

習題 12.1 在例12.1程式基礎上作一些修改。定義Point類,由Point類派生出Circle類,再由Circle類派生出Cylinder類。將類的定義部分分別作為3個頭檔案,對它們的成員。。。

C++程式設計(第三版) 譚浩強 習題12.1 個人設計

習題 12.1 在例12.1程式基礎上作一些修改。定義Point類,由Point類派生出Circle類,再由Circle類派生出Cylinder類。將類的定義部分分別作為3個頭檔案,對它們的成員函式的宣告部分分別作為3個原始檔,在主函式中用#include命令把它們包含進來,形成一個完整的程式,並上機執行。

程式碼塊:

Point.h標頭檔案

#include <iostream>
using namespace std;
class Point
{
public:
	Point(double x=0, double y=0);
	void setPoint(double, double);
	double getX() const{return x;}
	double getY() const{return y;}
	friend ostream & operator<<(ostream &, const Point &);
protected:
	double x, y;
};

Circle.h標頭檔案

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

Cylinder.h標頭檔案

class Cylinder: public Circle
{
public:
	Cylinder(double x=0, double y=0, double r=0, double h=0);
	void setHeight(double);
	double getHeight() const;
	double area() const;
	double volume() const;
	friend ostream& operator<<(ostream &, const Cylinder &);
protected:
	double height;
};

PointFun函式

#include <iostream>
#include "Point.h"
using namespace std;
Point::Point(double a, double b)
{
	x=a; y=b;
}
void Point::setPoint(double a, double b)
{
	x=a; y=b;
}
ostream& operator<<(ostream &output, const Point &p)
{
	output<<"["<<p.x<<", "<<p.y<<"]"<<endl;
	return output;
}

CircleFun函式

#include <iostream>
#include "Point.h"
#include "Circle.h"
using namespace std;
Circle::Circle(double a, double b, double r): Point(a, b), radius(r){}
void Circle::setRadius(double r){radius=r;}
double Circle::getRadius() const { return radius;}
double Circle::area() const {return 3.14159*radius*radius;}
ostream& operator<<(ostream &output, const Circle &c)
{
	output<<"Center=["<<c.x<<", "<<c.y<<"], r="<<c.radius<<", area="<<c.area()<<endl;
	return output;
}

CylinderFun函式

#include <iostream>
#include "Point.h"
#include "Circle.h"
#include "Cylinder.h"
using namespace std;
Cylinder::Cylinder(double a, double b, double r, double h)
	:Circle(a, b, r), height(h){}
void Cylinder::setHeight(double h) {height=h;}
double Cylinder::getHeight() const {return height;}
double Cylinder::area() const {return 2*Circle::area()+2*3.14159*radius*height;}
double Cylinder::volume() const {return Circle::area()*height;}
ostream& operator<<(ostream &output, const Cylinder &cy)
{
	output<<"Center=["<<cy.x<<", "<<cy.y<<"], r="<<cy.radius<<", h="<<cy.height
		<<"\narea="<<cy.area()<<", volume="<<cy.volume()<<endl;
	return output;
}

main函式

#include <iostream>
#include "Point.h"
#include "Circle.h"
#include "Cylinder.h"
using namespace std;
int main()
{
	Cylinder cy1(3.5, 6.4, 5.2, 10);
	cout<<"\noriginal cylinder:\nx="<<cy1.getX()<<", y="<<cy1.getY()<<", r="
		<<cy1.getRadius()<<", h="<<cy1.getHeight()<<"\narea="<<cy1.area()
		<<", volume="<<cy1.volume()<<endl;
	cy1.setHeight(15);
	cy1.setRadius(7.5);
	cy1.setPoint(5, 5);
	cout<<"\nnew cylinder:\n"<<cy1;
	Point &pRef=cy1;
	cout<<"\npRef as a Point:"<<pRef;
	Circle &cRef=cy1;
	cout<<"\ncRef as a Circle:"<<cRef;
	system("pause");
	return 0;
}