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

一、Point类的实现

Point类的实现较为简单,根据题目给出的要求实现即可。

Point.h:

#ifndef __POINT_H__
#define __POINT_H__

#include <iostream>

class Point {
public:
    Point(double xv = 0, double yv = 0);  //构造函数,参数为点的x坐标和y坐标
    double getX() const;  //获取x坐标
    double getY() const;  //获取y坐标
    void setX(double xv);  //设置x坐标
    void setY(double yv);  //设置y坐标
    friend std::ostream& operator<<(std::ostream& out, const Point& p);  //重载输出运算符
    friend std::istream& operator>>(std::istream& in, Point& p);  //重载输入运算符
private:
    double x, y;
};

#endif

Point.cpp:

#include "Point.h"

Point::Point(double xv, double yv) : x(xv), y(yv) {}

double Point::getX() const {
    return x;
}

double Point::getY() const {
    return y;
}

void Point::setX(double xv) {
    x = xv;
}

void Point::setY(double yv) {
    y = yv;
}

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 c;
    in >> c >> p.x >> c >> p.y >> c;
    return in;
}

二、Circle类的实现

Circle类实现时需要继承Point类和Plane类,实现面向对象编程中的多重继承。

Circle.h:

#ifndef __CIRCLE_H__
#define __CIRCLE_H__

#include "Point.h"
#include "Plane.h"

class Circle : public Point, public Plane {
public:
    Circle(double xv = 0, double yv = 0, double rv = 0);  //构造函数,参数为圆心坐标和半径
    double getR() const;  //获取半径
    void setR(double r);  //设置半径
    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);  //重载输入运算符
private:
    double radius;
    static const double PI;  //常量PI
};

#endif

Circle.cpp:

#include "Circle.h"
#include <cmath>

const double Circle::PI = 3.14159;

Circle::Circle(double xv, double yv, double rv) : Point(xv, yv), radius(rv) {}

double Circle::getR() const {
    return radius;
}

void Circle::setR(double r) {
    radius = r;
}

double Circle::area() const {
    return PI * pow(radius, 2);
}

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 ch;
    double x, y, r;
    in >> ch >> x >> ch >> y >> ch >> r >> ch;
    c = Circle(x, y, r);
    return in;
}

三、main函数的实现

main函数首先读入d1和d2,并根据d1和d2的值构造一个Point对象p,接着将Point对象p写入文本文件s3.txt中,然后从文件s3.txt中读入数据,设置Circle对象c,将设置好的Circle对象c写入二进制文件b3.dat中,最后从文件b3.dat中读入数据,调用f函数。

main.cpp:

#include <iostream>
#include <fstream>
#include "Circle.h"

void f(Plane const& p) {
    std::cout << p.area() << std::endl;
    std::cout << p.length() << std::endl;
}

int main(void) {
    double d1, d2;
    std::cin >> d1 >> d2;
    Point p(d1, d2);
    std::ofstream fout("s3.txt");
    fout << p << std::endl;
    fout.close();
    Point q;
    std::ifstream fin("s3.txt");
    fin >> q;
    fin.close();
    Circle c;
    c.setX(q.getY());
    c.setY(q.getX());
    c.setR(q.getY() + q.getX());
    std::ofstream bout("b3.dat", std::ios::binary);
    bout.write((char*)&c, sizeof(Circle));
    bout.close();
    std::ifstream bin("b3.dat", std::ios::binary);
    bin.read((char*)&c, sizeof(Circle));
    bin.close();
    f(c);
    return 0;
}

完整代码

#ifndef __POINT_H__
#define __POINT_H__

#include <iostream>

class Point {
public:
    Point(double xv = 0, double yv = 0);  //构造函数,参数为点的x坐标和y坐标
    double getX() const;  //获取x坐标
    double getY() const;  //获取y坐标
    void setX(double xv);  //设置x坐标
    void setY(double yv);  //设置y坐标
    friend std::ostream& operator<<(std::ostream& out, const Point& p);  //重载输出运算符
    friend std::istream& operator>>(std::istream& in, Point& p);  //重载输入运算符
private:
    double x, y;
};

#endif

#include "Point.h"

Point::Point(double xv, double yv) : x(xv), y(yv) {}

double Point::getX() const {
    return x;
}

double Point::getY() const {
    return y;
}

void Point::setX(double xv) {
    x = xv;
}

void Point::setY(double yv) {
    y = yv;
}

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 c;
    in >> c >> p.x >> c >> p.y >> c;
    return in;
}

#ifndef __CIRCLE_H__
#define __CIRCLE_H__

#include "Point.h"
#include "Plane.h"

class Circle : public Point, public Plane {
public:
    Circle(double xv = 0, double yv = 0, double rv = 0);  //构造函数,参数为圆心坐标和半径
    double getR() const;  //获取半径
    void setR(double r);  //设置半径
    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);  //重载输入运算符
private:
    double radius;
    static const double PI;  //常量PI
};

#endif

#include "Circle.h"
#include <cmath>

const double Circle::PI = 3.14159;

Circle::Circle(double xv, double yv, double rv) : Point(xv, yv), radius(rv) {}

double Circle::getR() const {
    return radius;
}

void Circle::setR(double r) {
    radius = r;
}

double Circle::area() const {
    return PI * pow(radius, 2);
}

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 ch;
    double x, y, r;
    in >> ch >> x >> ch >> y >> ch >> r >> ch;
    c = Circle(x, y, r);
    return in;
}

#include <iostream>
#include <fstream>
#include "Circle.h"

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;
}

void f(Plane const& p) {
    std::cout << p.area() << std::endl;
    std::cout << p.length() << std::endl;
}

int main(void) {
    double d1, d2;
    std::cin >> d1 >> d2;
    Point p(d1, d2);
    std::ofstream fout("s3.txt");
    fout << p << std::endl;
    fout.close();
    Point q;
    std::ifstream fin("s3.txt");
    fin >> q;
    fin.close();
    Circle c;
    c.setX(q.getY());
    c.setY(q.getX());
    c.setR(q.getY() + q.getX());
    std::ofstream bout("b3.dat", std::ios::binary);
    bout.write((char*)&c, sizeof(Circle));
    bout.close();
    std::ifstream bin("b3.dat", std::ios::binary);
    bin.read((char*)&c, sizeof(Circle));
    bin.close();
    f(c);
    return 0;
}

补充说明

  • 以上代码仅供参考,实际使用中可能需要根据具体需求进行调整。
  • 可以根据需要添加更多功能,例如:添加圆的半径、圆心的坐标等属性;重载其他运算符;实现其他功能等等。
  • 该代码实现了基本的文件读写操作,可以根据实际需求进行修改,例如:使用不同的文件格式;进行更复杂的文件操作等等。
  • 在进行文件操作时,需要确保文件操作的正确性,避免出现文件操作错误。
  • 可以使用其他工具进行代码测试和调试,例如:使用调试器;使用测试框架等等。

希望这篇文章能够帮助你理解如何使用C++语言基于Point类和Plane类设计圆类Circle,并重载运算符实现文件读写操作。

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

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

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