本文通过一个判断点和圆位置关系的实例,来记录C++中类和对象分文件编写的过程。
#include
using namespace std;
//点和圆的关系//点类
class Point {
private:int d_x; // 横坐标int d_y;// 纵坐标
public:void setLocation(int x,int y) { //设置坐标d_x = x;d_y = y;}int getDx() {return d_x;}int getDy() {return d_y;}};//圆类
class Circle {
public:void setR(int r) //设置半径{Y_r = r;}void setPoint(Point p)//设置圆心{o = p;}Point getPoint() //读取圆心{return o;}int getR() //读取半径{return Y_r;}private://在类中可以让另一个类作为本类做的一个成员Point o;int Y_r;//半径
};void judge(Circle& C,Point &P)
{int m = (P.getDx() - C.getPoint().getDx()) * (P.getDx() - C.getPoint().getDx()) + (P.getDy() - C.getPoint().getDy()) * (P.getDy() - C.getPoint().getDy());int r = C.getR() * C.getR();if (m > r){cout << "点在圆外!" << endl;}else if (m == r) {cout << "点在圆上!" << endl;}else{cout << "点在圆内!" << endl;}}
int main()
{Circle C1;Point center;//定义圆心,不然point类没办法对private里的o进行操作!!!!center.setLocation(0, 0);C1.setPoint(center);C1.setR(2);Point p1;p1.setLocation(2, 5);Point p2;p2.setLocation(1, 1);Point p3;p3.setLocation(0, -2);cout << "p1:" << endl;judge(C1,p1);cout << "p2:" << endl;judge(C1,p2);cout << "p3:" << endl;judge(C1,p3);system("pause");return 0;
}
这个代码由于在主函数前既定义了一个判断函数,还定义了两个类,显得有些杂乱,因此我们需要进行分文件编写来美化我们的代码。
类和对象分文件编写其实和函数的分文件编写类似
1)先创建一个后缀名为.h的头文件
2)再创建一个.cpp为后缀名的源文件
3)在头文件中写声明
4)在源文件中写定义
具体可以参考这篇关于函数的分文件编写
创建如下文件列表存放类和函数
#pragma once
#include
using namespace std;
//点类
class Point {
private:int d_x; // 横坐标int d_y;// 纵坐标
public:void setLocation(int x, int y); //设置坐标int getDx();int getDy();};
在头文件中写 Point类的 声明,删去原来定义的内容。
其中 # pragma once 代表让编译器只运行一次,防止重复运行。
#include"point.h"
//因为下面的函数都是成员函数,所以需要告诉编译器实在point作用域下的成员函数void Point::setLocation(int x, int y) { //设置坐标d_x = x;d_y = y;
}
int Point::getDx() {return d_x;
}int Point::getDy() {return d_y;
}
源文件中写类的定义函数
void Point::setLocation(int x, int y) 中的 Point:: 是为了告诉编译器这是在Point作用域下的成员函数,后面的成员函数定义也是这样。
#pragma once
#include
#include"point.h" //在圆类中有点类的调用,因此要在圆类的头文件中引用点类的头文件
using namespace std;
class Circle {
public:void setR(int r); //设置半径void setPoint(Point p);//设置圆心Point getPoint();//读取圆心int getR(); //读取半径private://在类中可以让另一个类作为本类做的一个成员Point o;int Y_r;//半径
};
和点类头文件一样,做圆类的声明,但是在圆类中运用了点类作为其函数成员,因此在头文件中要引用点类的头文件
#include"circle.h"void Circle::setR(int r) //设置半径
{Y_r = r;
}void Circle::setPoint(Point p)//设置圆心
{o = p;
}Point Circle::getPoint() //读取圆心
{return o;
}int Circle::getR() //读取半径
{return Y_r;
}
和点类一样,在源文件中定义了圆类的成员函数
函数的分文件编写和类的类似,都是在头文件中写定义,在源文件中写声明。
#pragma once
#include
#include"circle.h"
#include"point.h"
using namespace std;
void judge(Circle& C, Point& P);
由于其这个函数引用了圆类和点类,要在函数的头文件中对圆类和点类做一个声明。
#include"judge.h"
void judge(Circle& C, Point& P)
{int m = (P.getDx() - C.getPoint().getDx()) * (P.getDx() - C.getPoint().getDx()) + (P.getDy() - C.getPoint().getDy()) * (P.getDy() - C.getPoint().getDy());int r = C.getR() * C.getR();if (m > r){cout << "点在圆外!" << endl;}else if (m == r) {cout << "点在圆上!" << endl;}else{cout << "点在圆内!" << endl;}}
源文件中写 judge函数的定义。
#include
#include"circle.h"
#include"point.h"
#include"judge.h"
using namespace std;int main()
{Circle C1;Point center;//定义圆心,不然point类没办法对private里的o进行操作!!!!center.setLocation(0, 0);C1.setPoint(center);C1.setR(2);Point p1;p1.setLocation(2, 5);Point p2;p2.setLocation(1, 1);Point p3;p3.setLocation(0, -2);cout << "p1:" << endl;judge(C1,p1);cout << "p2:" << endl;judge(C1,p2);cout << "p3:" << endl;judge(C1,p3);system("pause");return 0;
}
主函数中只要引入要用到的类和函数的头文件即可实现其功能。
通过类和对象的分文件编写,可以将一堆杂乱的代码分成数个简单的代码文件,使代码更具有可读性。
上一篇:操作系统之磁盘相关
下一篇:5.网络爬虫——Xpath解析