C++类的声明和类的实现分开写(.hpp和.cpp)

  • Post author:
  • Post category:其他




1.声明和实现为什么要分开写

现在开始写项目了,你会发现我们一般都要写一个cpp,对应的还得有一个h文件,那么为什么在C++中我们要这么做?

.h就是声明,.cpp就是实现,而所谓分离式实现就是指“声明”和“定义”分别保存在不同的文件中,声明保存在.h文件、定义保存在.cpp文件中。

那么将声明和定义分离有什么意义吗?

首先从非分离式(声明的同时给出定义)看,其内容一般保存在.h文件中,以供多个源文件引用。

但是将定义放在头文件,那么当多个源文件使用#include命令包含此类的头文件便会在链接阶段出现“multiple definition”链接错误!

那么想让多个文件使用此头文件,又不引发链接的“multiple definition”错误该怎么办呢?

分离式的实现便可以解决这个问题。因为.h文件中只包含声明,即使被多个源文件引用也不会导致“multiple definition”链接错误。

所以分离式实现增强了命名空间的实用性。



2.案例:

首先我们要实现确定一个点是否在园内的功能

所以我们需要两个类一个Point类,一个Circle类

首先我们要先创建一个项目,名为Test2(这是我的项目名字)这里不做过多的解释,使用vs应该都会创建项目(我是创建的C++的项目,所以选择Win32控制台应用程序,创建的空项目)

然后右击项目名称—添加,点击创建类。

在这里插入图片描述

然后选择类,双击会出现下面的界面

在这里插入图片描述

键入Point会显示出一个.h文件,一个.cpp文件,点击完成,会出现一个源文件,一个头文件。文件名为Point

#pragma once
class Point
{
public:
	int GetX();
	
	int GetY();
	
	Point(int x, int y);
 
	Point();
 
private:
	int x;
	int y;
};

在Point.h文件中编入代码,是关于一些成员函数的声明#Pragma once 是表示只读一次

然后再Point.cpp文件中编入一下代码

#include "Point.h"
 
int Point::GetX()   //要加上作用域 Point::
{
	return x;
}
 
int Point::GetY()
{
	return y;
}
 
Point::Point(int x1, int y1)
{
	x = x1;
	y = y1;
}
 
Point::Point()
{
 
 
}

主要是Point.h中的函数的实现,要引入Point.h头文件,所以要写入#include“Point.h”

然后再以同样的方法创建一个名为Circle的类

在Circle.h中编入以下代码

#pragma once
#include"Point.h"
 
class Circle
{
public:
 
	double GetR(double r);
	
	double GetS();
	
	double GetC();
	
	Point GetO();
	
	bool IsInCircle(Point p);
	
	Circle(Point o1, double r1);
 
	Circle();
 
private:
	double m_r;
	double m_s;
	double m_c;
	Point o;
};

因为用到了Point 类,所以也要#include “Point.h”

在Circle.cpp中编入以下代码

#include "Circle.h"
#include"Point.h"
 
double Circle::GetR(double r)  //要写出作用域Circle::
{
	m_r = r;
	return m_r;
}
 
double Circle::GetS()
{
	m_s = 3.14*m_r*m_r;
	return m_s;
}
 
double Circle::GetC()
{
	m_c = 2 * 3.14*m_r;
	return m_c;
}
 
Point Circle::GetO()
{
	return o;
}
 
bool Circle::IsInCircle(Point p)
{
	if (((p.GetX() - o.GetX())*(p.GetX() - o.GetX()) + (p.GetY() - o.GetY())*(p.GetY() - o.GetY())) <= m_r*m_r)
	{
		return true;
	}
	else
	{
		return false;
	};
}
 
Circle::Circle(Point o1, double r1)
{
	o = o1;
	m_r = r1;
}
Circle::Circle()
{
 
}

也主要是Circle.h 中的函数实现,IsInCiicle是实现点是否在圆内的函数

然后右击源文件,添加,添加新项,创建一个.cpp文件,命名为main.cpp

在这里插入图片描述

在这里插入图片描述

此文件中有main方法,是程序的入口

在文件中编入以下代码

#include<iostream>
#include"Circle.h"
#include"Point.h"
using namespace std;
 
int main()
{
	Point o = Point(0, 0);
	Circle c1 = Circle(o, 5);
	Point p1(3, 4);
	bool b = c1.IsInCircle(p1);
	cout << b << endl;
 
	return 0;
}

确定好头文件,创建对象,调用方法