第11週プロジェクト4-ファミリーの設計

3351 ワード

以下のヒントに従って、ベースクラスの設計とテストから始めて、次第に各クラスの設計を完成して、円格柱体の表面積、体積を求めて出力してそして要求の計算任務を完成します:(1)まず1つのPoint(点)クラスを創立して、データメンバーx,y(座標点)を含んで、必要なメンバー関数を実現して、main関数を設計してテストを完成します;(2)Pointをベースクラスとし、Circle(円)クラスを派生し、データメンバーr(半径)を増やし、面積を求めるメンバー関数areaを求め、他に必要なメンバー関数を実現し、main関数を設計してテストを完了する.(3)さらにCircleクラスを直接ベースクラスとし,Cylinder(円柱)クラスを派生させ,データメンバーh(高)を増やし,円柱表面積を求めるメンバー関数areaと円柱体積を求めるメンバー関数volumeを求め,必要なメンバー関数を実現し,main関数を設計してテストを完了する.コンストラクション関数、コンストラクション関数、データ・メンバーの変更、データ・メンバーの取得に使用される共通インタフェース、出力に使用されるリロード演算子「<<」関数など、プログラムの作成が必要です.(ヒント:このタスクは、3つのサブタスクに分けていくつかのステップに分けられます.ベースクラスを先に説明し、派生クラスを宣言し、段階的に実行し、段階的にデバッグします.--この方法は、任意のプロジェクトに適用されます)-クラスファミリーの設計
/*
 *Copyright  (c)  2014, 
 *All rights reserved.
 * : test.cpp
 *          : 
 * :2015   5   18  
 * :v1.0
 */
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cmath>
using namespace std;
const double pi=3.14;
class Point // 
{
public:
    Point():x(0),y(0) {};
    Point(double x0, double y0):x(x0), y(y0) {};
    double getx();
    double gety();
    void PrintPoint(); // 
protected:
    double x,y;   // 
};
void Point::PrintPoint()
{
    cout<<"Point: ("<<x<<","<<y<<")";    // 
}
double Point::getx()
{
    return x;
}
double Point::gety()
{
    return y;
}

class Circle:public Point
{
private:
    double r;
public:
    Circle(double x0=0, double y0=0,double rr=0):Point(x0,y0),r(rr) {}
    void setr(double rr);
    double getr()const;
    double area() const;
    double length() const;
    friend ostream &operator<<(ostream &out,const Circle &c);
};
void Circle::setr(double rr)
{
    r=rr;
}
double Circle::getr()const
{
    return r;
}
double Circle::length() const
{
    return 2*pi*r;
}
double Circle::area() const
{
    return pi*r*r;
}
ostream &operator<<(ostream &out,const Circle &c)
{
    out<<"Center:("<<c.x<<","<<c.y<<")"<<endl;
    out<<"circumference="<<c.length()<<endl;
    out<<"r="<<c.r<<",area="<<c.area()<<endl;
    return out;
}

class Cylinder:public Circle
{
public:
    Cylinder(double x0=0,double y0=0,double r=0,double h=0):Circle(x0,y0,r),heigh(h) {}
    double geth()const;
    double areas()const;
    double volume() const;
    friend ostream &operator<<(ostream &out,const Cylinder& cy);
private:
    double heigh;
};
double Cylinder::geth()const
{
    return heigh;
}
double Cylinder::areas()const
{
    return area()*2+length()*heigh;
}
double Cylinder::volume() const
{
    return area()*heigh;
}
ostream &operator<<(ostream &out,const Cylinder& cy)
{
    out<<"Center:("<<cy.x<<","<<cy.y<<")"<<endl;
    out<<"r="<<cy.getr()<<endl;
    out<<"h="<<cy.heigh<<endl;
    out<<"area="<<cy.areas()<<endl;
    out<<"volume="<<cy.volume()<<endl;
    return out;
}
int main()
{
    Cylinder cy(3.5,6.4,5.2,10);
    cout<<cy;
    return 0;
}

画像:
心得:
面倒くさい、头がくらくらする==いつもそれを忘れている...
でも昨夜は難しくないと思ったけど、ちょっと面倒だった.
基本的にこれをして継承と派生について知っている差は多くありません.