C++圆类设计与运算符重载:基于Point类和Plane类实现圆类及文件读写操作
基于Point类及平面基类Plane类,设计圆类Circle,并为Point类和Circle重载实现<<和>>运算符,main(void)函数实现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)的操作顺序描述如下: ①首先已输入的d1、d2来构造Point对象p,并将p用<<写入文本文件s3.txt中。 ②再将文本文件s3.txt打开,应用>>操作将里面的数据读入到Point对象p中。 ③利用Point对象p的数据设置Circle对象c,设置要求:将c的圆心X坐标设置为p的Y坐标,将c的圆心Y坐标设置为p的X坐标,将c的半径设置为p的Y坐标与X坐标的和。并将设置好的c写入二进制文件b3.dat中。 ④再将二进制文件b3.dat打开,将里面的数据读入到Circle对象c中。 ⑤最后以c对象为参数调用f函数。
答案
第一部分,Point类和Circle类的实现如下:
Point类实现:
Point.h文件:
#ifndef __POINT_H__
#define __POINT_H__
#include <iostream>
class Point
{
private:
double x;
double y;
public:
Point(double xv = 0, double yv = 0); /* 构造函数 */
void setX(double xv); /* 设置X坐标 */
void setY(double yv); /* 设置Y坐标 */
double getX() const; /* 获取X坐标 */
double getY() const; /* 获取Y坐标 */
friend std::ostream &operator<<(std::ostream &out, const Point &p); // 运算符<<重载
friend std::istream &operator>>(std::istream &in, Point &p); // 运算符>>重载
};
#endif
Point.cpp文件:
#include 'Point.h'
Point::Point(double xv, double yv) : x(xv), y(yv)
{
}
void Point::setX(double xv)
{
x = xv;
}
void Point::setY(double yv)
{
y = yv;
}
double Point::getX() const
{
return x;
}
double Point::getY() const
{
return y;
}
std::ostream &operator<<(std::ostream &out, const Point &p)
{
out << '(' << p.getX() << ',' << p.getY() << ')';
return out;
}
std::istream &operator>>(std::istream &in, Point &p)
{
char c1, c2, c3;
double x, y;
in >> c1 >> x >> c2 >> y >> c3;
if (c1 == '(' && c2 == ',' && c3 == ')')
{
p.setX(x);
p.setY(y);
}
return in;
}
Circle类实现:
Circle.h文件:
#ifndef __CIRCLE_H__
#define __CIRCLE_H__
#include 'Point.h'
#include 'Plane.h'
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 std::ostream &operator<<(std::ostream &out, const Circle &c); // 运算符<<重载
friend std::istream &operator>>(std::istream &in, Circle &c); // 运算符>>重载
};
#endif
Circle.cpp文件:
#include 'Circle.h'
const double Circle::PI = 3.14159;
Circle::Circle(double xv, double yv, double r) : Point(xv, yv), radius(r)
{
}
void Circle::setR(double r)
{
radius = r;
}
double Circle::getR() const
{
return radius;
}
double Circle::area() const
{
return PI * radius * radius;
}
double Circle::length() const
{
return 2 * PI * radius;
}
std::ostream &operator<<(std::ostream &out, const Circle &c)
{
out << '(' << c.getX() << ',' << c.getY() << '),' << c.getR();
return out;
}
std::istream &operator>>(std::istream &in, Circle &c)
{
char ch1, ch2, ch3, ch4, ch5;
double x, y, r;
in >> ch1 >> ch2 >> x >> ch3 >> y >> ch4 >> r >> ch5;
if (ch1 == '(' && ch2 == '(' && ch3 == ',' && ch4 == ')' && ch5 == ')')
{
c.setX(x);
c.setY(y);
c.setR(r);
}
return in;
}
第二部分,main函数的实现如下:
#include <iostream>
#include <fstream>
using namespace std;
#include 'Point.h'
#include 'Circle.h'
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;
ofstream ofs('s3.txt');
if (ofs)
{
ofs << p;
ofs.close();
}
else
{
cerr << 'open file s3.txt failed' << endl;
return -1;
}
ifstream ifs('s3.txt');
if (ifs)
{
ifs >> p;
c.setX(p.getY());
c.setY(p.getX());
c.setR(p.getY() + p.getX());
ifs.close();
}
else
{
cerr << 'open file s3.txt failed' << endl;
return -1;
}
ofstream ofs1('b3.dat', ios::binary);
if (ofs1)
{
ofs1.write((char *)&c, sizeof(c));
ofs1.close();
}
else
{
cerr << 'open file b3.dat failed' << endl;
return -1;
}
ifstream ifs1('b3.dat', ios::binary);
if (ifs1)
{
Circle temp;
ifs1.read((char *)&temp, sizeof(temp));
ifs1.close();
f(temp);
}
else
{
cerr << 'open file b3.dat failed' << endl;
return -1;
}
return 0;
}
输入样例:
1.0 2.1
输出样例:
30.1907 19.4779
原文地址: https://www.cveoy.top/t/topic/okBL 著作权归作者所有。请勿转载和采集!