今天我们来学习一下类的分文件编写。
在我们平时的项目中,很少有一个文件完成的。
即使有, 那么这个文件也会很长。看上去结构就不会那么清晰。
所以我们今天用一个简单的例子,来说明一下如何使用分文件编写的方式,
来完成一个简单的项目。
我们使用的例子是在平面上一个点和圆的关系:
(1) 点在圆内。
(2)点在圆周上。
(3)点在圆外面。
今天我们直接使用类内部成员属性来判断,不使用外部函数来判断。
我们看下文件的结构:
main文件调用point类和circle类,point/circle又分为头文件和cpp文件。
在头文件中,实现类的定义和成员变量成员属性的声明。包括访问权限的控制。
具体的类的方法实现部分放到cpp文件中。
接下来我们看下源码:
先看简单的,Point类的分解。
point.h
#pragma once //头文件一般要写这句话,防止编译器重复编译。类似于C的#define __XXX_H ...
#include <iostream> //接下来这两句是套路,基本都要这么写,因为下面会用到这些东西
using namespace std;
class Point{
private:
int px; //点的横坐标
int py; //点的纵坐标
public:
void setX(int x); //设置点的横坐标
void setY(int y); //设置点的纵坐标
int getX(void); //获取点的横坐标
int getY(void); //获取点的纵坐标
};
point.cpp
/****************************************************
* brief : 设计一Point类
* author : shao
* date : 2020-02-25
* note : none
*
****************************************************/
#include "point.h"
void Point::setX(int x)
{
px = x;
}
void Point::setY(int y)
{
py = y;
}
int Point::getX(void)
{
return px;
}
int Point::getY(void)
{
return py;
}
circle.h
#pragma once
#include <iostream>
using namespace std;
#include "point.h"
class Circle{
private:
int c_radius;
Point p_center;
public:
void setCRadius(int r);
int getCRadius(void);
void setPCenter(Point p);
Point getPCenter(void);
//判断点是否在圆内
void isPointInnerCircle(Point p);
};
circle.cpp
/****************************************************
* brief : 设计一Circle类,包含圆心和半径
* author : shao
* date : 2020-02-25
* note : none
*
****************************************************/
#include "circle.h"
void Circle::setCRadius(int r)
{
c_radius = r;
}
int Circle::getCRadius(void)
{
return c_radius;
}
/**
* 设置圆心,圆心是类Point
*/
void Circle::setPCenter(Point p)
{
p_center = p; //类和基础类型一样,也可以直接赋值
}
Point Circle::getPCenter(void)
{
return p_center;
}
void Circle::isPointInnerCircle(Point p)
{
//计算点到圆心的距离的平方
int p_distance = (p.getX() - p_center.getX())*(p.getX() - p_center.getX()) +
(p.getY() - p_center.getY())*(p.getY() - p_center.getY());
int r_distance = c_radius * c_radius;
cout << "r_distance = " << r_distance << endl;
cout << "p_distance = " << p_distance << endl;
if(p_distance == r_distance)
{
cout << "Point is on circle round!" << endl;
}else if(p_distance < r_distance)
{
cout << "Point is inner circle!" << endl;
}
else
{
cout << "Point is out circle!" << endl;
}
}
main.cpp
/****************************************************
* brief : 测试圆和点的关系
* author : shao
* date : 2020-02-25
* note : none
*
****************************************************/
#include <iostream>
#include "point.h"
#include "circle.h"
using namespace std;
void test01(void)
{
Point p1; //圆周上
p1.setX(10);
p1.setY(10);
Point p2; //圆外
p2.setX(10);
p2.setY(11);
Point p3; //圆内
p3.setX(10);
p3.setY(9);
Circle c;
//设置圆心坐标
Point p_c;
p_c.setX(10);
p_c.setY(0);
//设置半径
c.setCRadius(10);
//设置圆心
c.setPCenter(p_c);
//判断点和圆的关系
cout << "/*****p1 test****/" << endl;
c.isPointInnerCircle(p1);
cout << "\n/*****p2 test****/" << endl;
c.isPointInnerCircle(p2);
cout << "\n/*****p3 test****/" << endl;
c.isPointInnerCircle(p3);
}
int main(void)
{
test01();
return 0;
}
结果如下: