以Point类及平面基类Plane类为基础设计圆类Circle并实现相关文件操作

以Point类及平面基类Plane类为基础设计圆类Circle并实现相关文件操作
内容:基于Point类及平面基类Plane类,设计圆类Circle,并为Point类和Circle重载实现<<和>>运算符,main(void)函数实现Point对象和Circle对象的文件读写操作。
Point类说明:


```c++

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类结构说明:**

```c++

公有派生圆类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)说明:


```c++

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
输出样例:

```c++

30.1907
19.4779
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    Point类和Circle类的<<和>>运算符重载示例:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    class Point {
    public:
        float x,y;
        Point(float xx = 0, float yy = 0) : x(xx), y(yy) {}
        friend ostream& operator<<(ostream& os, const Point& p);
        friend istream& operator>>(istream& is, Point& p);
    };
    
    ostream& operator<<(ostream& os, const Point& p) {
        os << "(" << p.x << ", " << p.y << ")";
        return os;
    }
    
    istream& operator>>(istream& is, Point &p) {
        is >> p.x >> p.y;
        return is;
    }
    
    class Circle : public Point {
    public:
        float r;
        Circle(float xx = 0, float yy = 0, float rr = 0) : Point(xx, yy), r(rr) {}
        friend ostream& operator<<(ostream& os, const Circle& c);
        friend istream& operator>>(istream& is, Circle& c);
    };
    
    ostream& operator<<(ostream& os, const Circle& c) {
        os << "Center: " << static_cast<Point>(c) << "; Radius: " << c.r;
        return os;
    }
    
    istream& operator>>(istream& is, Circle& c) {
        is >> static_cast<Point&>(c) >> c.r;
        return is;
    }
    

    在main函数中实现Point对象和Circle对象的文件读写操作示例:

    int main() {
        Point p;
        Circle c;
    
        // 写入Point对象到文件
        ofstream outFile("point.txt");
        if (outFile.is_open()) {
            cout << "Write to file point.txt" << endl;
            outFile << "2.3 4.5";
            outFile.close();
        } else {
            cout << "Failed to open file" << endl;
        }
    
        // 从文件读取Point对象
        ifstream inFile("point.txt");
        if (inFile.is_open()) {
            cout << "Read from file point.txt" << endl;
            inFile >> p;
            cout << "Point: " << p << endl;
            inFile.close();
        } else {
            cout << "Failed to open file" << endl;
        }
    
        // 写入Circle对象到文件
        outFile.open("circle.txt");
        if (outFile.is_open()) {
            cout << "Write to file circle.txt" << endl;
            outFile << "2.3 4.5 7.8";
            outFile.close();
        } else {
            cout << "Failed to open file" << endl;
        }
    
        // 从文件读取Circle对象
        inFile.open("circle.txt");
        if (inFile.is_open()) {
            cout << "Read from file circle.txt" << endl;
            inFile >> c;
            cout << "Circle: " << c << endl;
            inFile.close();
        } else {
            cout << "Failed to open file" << endl;
        }
    
        return 0;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^