本文通过一个判断点和圆位置关系的实例,来记录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;
}
主函数中只要引入要用到的类和函数的头文件即可实现其功能。
通过类和对象的分文件编写,可以将一堆杂乱的代码分成数个简单的代码文件,使代码更具有可读性。