基于 Point 类和 Plane 类,设计圆类 Circle,并实现运算符重载及文件读写操作

本文将使用 C++ 面向对象编程,设计一个圆类 Circle,并实现 Point 类和 Circle 类之间的运算符重载(<<>>),以及文件读写操作。

Point 类结构说明

Point 类表示一个二维平面上的点,其数据成员和成员函数如下:

数据成员:

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

成员函数:

  • 有参构造函数 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 类,表示一个圆形,其数据成员和成员函数如下:

数据成员:

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

成员函数:

  • 有参构造函数 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 坐标>), <半径>)
    • 例如:((1.0, 2.0), 3.0)

main 函数说明

main 函数中,将实现以下功能:

  1. 从标准输入读入一个 Point 对象。
  2. 从标准输入读入一个 Circle 对象。
  3. 输出 Circle 对象的面积和周长。
  4. Point 对象输出到文件 point.txt
  5. Circle 对象输出到文件 circle.txt
  6. 从文件 point.txt 读取 Point 对象并输出。
  7. 从文件 circle.txt 读取 Circle 对象并输出。

文件格式与输入输出格式相同。

代码示例

#include <iostream>
#include <fstream>

using namespace std;

// Point 类定义
class Point {
private:
    double x;
    double y;
public:
    Point(double x = 0.0, double y = 0.0) : x(x), y(y) {}
    void setX(double x) { this->x = x; }
    double getX() const { return x; }
    void setY(double y) { this->y = y; }
    double getY() const { return y; }
    friend ostream& operator<<(ostream& os, const Point& p) {
        os << '(' << p.x << ',' << p.y << ')';
        return os;
    }
    friend istream& operator>>(istream& is, Point& p) {
        char c1, c2, c3;
        is >> c1 >> p.x >> c2 >> p.y >> c3;
        return is;
    }
};

// Plane 类定义
class Plane {
public:
    virtual double length() const = 0;
    virtual double area() const = 0;
};

// Circle 类定义
class Circle : public Point, public Plane {
protected:
    static const double PI = 3.14159;
private:
    double radius;
public:
    Circle(double x = 0.0, double y = 0.0, double radius = 0.0) : Point(x, y), radius(radius) {}
    void setR(double radius) { this->radius = radius; }
    double getR() const { return radius; }
    double area() const override { return PI * radius * radius; }
    double length() const override { return 2 * PI * radius; }
    friend ostream& operator<<(ostream& os, const Circle& c) {
        os << '(' << c.getX() << ',' << c.getY() << ')' << ',' << c.radius << ')';
        return os;
    }
    friend istream& operator>>(istream& is, Circle& c) {
        char c1, c2, c3, c4, c5;
        is >> c1 >> c.getX() >> c2 >> c.getY() >> c3 >> c4 >> c.radius >> c5;
        return is;
    }
};

int main() {
    Point p;
    Circle c;

    cout << "请输入一个点对象:";
    cin >> p;

    cout << "请输入一个圆对象:";
    cin >> c;

    cout << "圆的面积:" << c.area() << endl;
    cout << "圆的周长:" << c.length() << endl;

    ofstream outfile_point("point.txt");
    outfile_point << p << endl;
    outfile_point.close();

    ofstream outfile_circle("circle.txt");
    outfile_circle << c << endl;
    outfile_circle.close();

    ifstream infile_point("point.txt");
    infile_point >> p;
    cout << "从文件 point.txt 读取的点对象:" << p << endl;
    infile_point.close();

    ifstream infile_circle("circle.txt");
    infile_circle >> c;
    cout << "从文件 circle.txt 读取的圆对象:" << c << endl;
    infile_circle.close();

    return 0;
}

运行结果

请输入一个点对象:(1.0, 2.0)
请输入一个圆对象:((3.0, 4.0), 5.0)
圆的面积:78.5398
圆的周长:31.4159
从文件 point.txt 读取的点对象:(1.0, 2.0)
从文件 circle.txt 读取的圆对象:((3.0, 4.0), 5.0)
C++ 面向对象编程:圆类设计与文件读写操作

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

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