C++ 面向对象编程:设计圆类并重载运算符实现文件读写

本文将介绍基于 Point 类和 Plane 类设计圆类 Circle 的方法,并重载了 << 和 >> 运算符,实现了 Point 对象和 Circle 对象的文件读写操作。

Point 类结构说明

Point 类的数据成员包括:

  • 私有数据成员:X 坐标 x (double 型),Y 坐标 y (double 型)。

Point 类成员函数包括:

  • 有参构造函数 Point(double, double),其中参数分别为 X 坐标和 Y 坐标,默认值均为 0。

  • 公有函数成员 void setX(double) 和 double getX() const 分别返回和设置 X 坐标。

  • 公有函数成员 void setY(double) 和 double getY() const 分别返回和设置 Y 坐标。

  • 重载运算符 << 以实现 Point 对象的格式输出,输出格式要求:

    (<X 坐标>,<Y 坐标>)
    

    例如:(1.0,2.0) 等。

  • 重载运算符 >> 以实现 Point 对象的格式输入,输入格式要求:

    (<X 坐标>,<Y 坐标>)
    

    例如:(1.0,2.0) 等。

Plane 类结构说明

Plane 类的成员函数包括:

  • 纯虚函数 virtual double length()const 用于计算平面图形的周长。
  • 纯虚函数 virtual double area()const 用于计算平面图形的面积。

Circle 类结构说明

公有派生圆类 Circle 以点类 Point、平面图形类 Plane 为基类,Circle 类的结构说明如下:

Circle 类的数据成员包括:

  • 圆心坐标继承自 Point 类。
  • 保护静态数据常量 PI (double 型),其值为 3.14159。
  • 私有数据成员:半径 radius (double 型)。

Circle 类成员函数包括:

  • 有参构造函数 Circle(double, double, double),其中函数参数包括圆心坐标和半径,圆心调用 Point 类构造函数进行构造,各参数默认值为 0。

  • 公有函数成员 void setR(double) 和 double getR()const 分别返回和设置 radius。

  • 重载 double area()const 用于计算圆的面积。

  • 重载 double length()const 用于计算圆的周长。

  • 重载运算符 << 以实现 Circle 对象的格式输出,输出格式要求:

    ((<X 坐标>,<Y 坐标>),<半径>)
    

    例如:((1.0,2.0),3.0) 等。

  • 重载运算符 >> 以实现 Circle 对象的格式输入,输入格式要求:

    ((<X 坐标>,<Y 坐标>),<半径>)
    

main(void) 说明

main(void) 的操作顺序描述如下:

  1. 首先已输入的 d1、d2 来构造 Point 对象 p,并将 p 用 << 写入文本文件 s3.txt 中。
  2. 再将文本文件 s3.txt 打开,应用 >> 操作将里面的数据读入到 Point 对象 p 中。
  3. 利用 Point 对象 p 的数据设置 Circle 对象 c,设置要求:
    • 将 c 的圆心 X 坐标设置为 p 的 Y 坐标。
    • 将 c 的圆心 Y 坐标设置为 p 的 X 坐标。
    • 将 c 的半径设置为 p 的 Y 坐标与 X 坐标的和。 并将设置好的 c 写入二进制文件 b3.dat 中。
  4. 再将二进制文件 b3.dat 打开,将里面的数据读入到 Circle 对象 c 中。
  5. 最后以 c 对象为参数调用 f 函数。

裁判测试程序样例

#include <iostream>
#include <fstream>
using namespace std;
//点类Point
class Point
{
private:
    double x;
    double y;
public:
    Point(double xv=0,double yv=0);
    void setX(double xv);
    void setY(double yv);
    double getX() const;
    double getY() const;
    friend ostream & operator << (ostream &out, const Point &p);
    friend istream & operator >> (istream &in, Point &p);
};
class Plane 
{
public:
    virtual double length()const=0;
    virtual double area()const=0;
};
//圆类Circle
class Circle:public Point,public Plane
{
private:
    double radius;
protected:
    static const double PI;
public:
    Circle(double xv=0,double yv=0,double r=0);
    void setR(double r);
    double getR() const;
    double area()const;
    double length()const;
    friend ostream & operator << (ostream &out, const Circle &c);
    friend istream & operator >> (istream &in, Circle &c);
};

/*请在这里填写第一部分答案*/

void f(Plane  const &p)
{
    cout<<p.area()<<endl;
    cout<<p.length()<<endl;
}
//主函数
int main(void)
{
    double d1,d2;
    cin>>d1>>d2;
    Point p(d1,d2);
    Circle c;
    
/*请在这里填写第二部分答案*/

    f(c);
    return 0;
}
### 输入样例

1.0 2.1
### 输出样例

30.1907
19.4779

参考答案

// Point 类实现
class Point
{
private:
    double x;
    double y;
public:
    Point(double xv=0,double yv=0):x(xv), y(yv){}
    void setX(double xv){x = xv;}
    void setY(double yv){y = yv;}
    double getX() const{return x;}
    double getY() const{return y;}
    friend ostream & operator << (ostream &out, const Point &p)
    {
        out<<'('<<p.x<<','<<p.y<<')';
        return out;
    }
    friend istream & operator >> (istream &in, Point &p)
    {
        char ch;
        in>>ch>>p.x>>ch>>p.y>>ch;
        return in;
    }
};

// Circle 类实现
class Circle:public Point,public Plane
{
private:
    double radius;
protected:
    static const double PI;
public:
    Circle(double xv=0,double yv=0,double r=0):Point(xv, yv), radius(r){}
    void setR(double r){radius = r;}
    double getR() const{return radius;}
    double area()const{return PI*radius*radius;}
    double length()const{return 2*PI*radius;}
    friend ostream & operator << (ostream &out, const Circle &c)
    {
        out<<'('<<c.getX()<<','<<c.getY()<<')'<<','<<c.radius;
        return out;
    }
    friend istream & operator >> (istream &in, Circle &c)
    {
        char ch;
        double x, y, r;
        in>>ch>>x>>ch>>y>>ch>>ch>>r>>ch;
        c.setX(y); //将c的圆心X坐标设置为p的Y坐标
        c.setY(x); //将c的圆心Y坐标设置为p的X坐标
        c.setR(x+y); //将c的半径设置为p的Y坐标与X坐标的和
        return in;
    }
};
const double Circle::PI = 3.14159;

// main 函数实现
int main(void)
{
    double d1,d2;
    cin>>d1>>d2;
    Point p(d1,d2);
    Circle c;
    ofstream fout("s3.txt");
    fout<<p; //将p用<<写入文本文件s3.txt中。
    fout.close();
    ifstream fin("s3.txt");
    fin>>p; //将里面的数据读入到Point对象p中。
    fin.close();
    c.setX(p.getY()); //将c的圆心X坐标设置为p的Y坐标
    c.setY(p.getX()); //将c的圆心Y坐标设置为p的X坐标
    c.setR(p.getY()+p.getX()); //将c的半径设置为p的Y坐标与X坐标的和
    ofstream fout1("b3.dat", ios::binary); //二进制文件输出流,注意要加ios::binary
    fout1.write((char*)&c, sizeof(c)); //将设置好的c写入二进制文件b3.dat中。
    fout1.close();
    ifstream fin1("b3.dat", ios::binary); //二进制文件输入流,注意要加ios::binary
    fin1.read((char*)&c, sizeof(c)); //将里面的数据读入到Circle对象c中。
    fin1.close();
    f(c);
    return 0;
}
C++ 面向对象编程:设计圆类并重载运算符实现文件读写

原文地址: https://www.cveoy.top/t/topic/okBl 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录