C++ 面向对象编程:基于 Point 类和 Plane 类设计圆类 Circle 并重载运算符
基于 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 函数。
裁判测试程序样例:
#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); /*设置X坐标*/
void setY(double yv); /*设置Y坐标*/
double getX() const; /*获取X坐标*/
double getY() const; /*获取Y坐标*/
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 c;
in>>c>>p.x>>c>>p.y>>c;
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 cl,cr;
in>>cl>>c.x>>cr>>c.y>>cl>>c.radius>>cr;
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 ofs('s3.txt');
ofs<<p<<endl; //将Point对象p写入文本文件中
ofs.close();
ifstream ifs('s3.txt');
ifs>>p; //从文本文件中读入数据并构造Point对象p
ifs.close();
c.setX(p.getY()); //将c的圆心X坐标设置为p的Y坐标
c.setY(p.getX()); //将c的圆心Y坐标设置为p的X坐标
c.setR(p.getX()+p.getY()); //将c的半径设置为p的Y坐标与X坐标的和
ofstream ofs2('b3.dat',ios::binary);
ofs2.write((char *)&c,sizeof(c)); //将Circle对象c写入二进制文件中
ofs2.close();
ifstream ifs2('b3.dat',ios::binary);
ifs2.read((char *)&c,sizeof(c)); //从二进制文件中读入数据并构造Circle对象c
ifs2.close();
f(c);
return 0;
}
注意事项
- 注意 Point 类和 Circle 类的实现,特别是运算符 << 和运算符 >> 的重载实现。
- 注意二进制文件的读写时需要加上 ios::binary 的标志。
原文地址: https://www.cveoy.top/t/topic/okCE 著作权归作者所有。请勿转载和采集!