C++ 面向对象编程:圆类设计与文件读写操作
基于 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 函数中,将实现以下功能:
- 从标准输入读入一个
Point对象。 - 从标准输入读入一个
Circle对象。 - 输出
Circle对象的面积和周长。 - 将
Point对象输出到文件point.txt。 - 将
Circle对象输出到文件circle.txt。 - 从文件
point.txt读取Point对象并输出。 - 从文件
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)
原文地址: https://www.cveoy.top/t/topic/ok3h 著作权归作者所有。请勿转载和采集!