1.hpp头文件与h头文件的区别:

(1) hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译。
而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库
(2)但是hpp也可以当作cpp来用,完全用来实现h文件中的模板声明。

2.hpp文件编写的注意事项

1、不可包含全局对象和全局函数。
由于hpp本质上是作为.h被调用者include,所以当hpp文件中存在全局对象或者全局函数,而该hpp被多个调用者include时,将在链接 时导致符号重定义错误。要避免这种情况,需要 去除全局对象,将全局函数封装为类的静态方法
2、类之间不可循环调用。
在.h和.cpp的场景中,当两个类或者多个类之间有循环调用关系时,只要预先在头文件做被调用类的声明即可,如下:
class B;
class A{
public:
void someMethod(B b);
};
class B{
public:
void someMethod(A a);
};
在hpp场景中,由于定义与实现都已经存在于一个文件,调用者必需明确知道被调用者的所有定义,而不能等到cpp中去编译。因此hpp中必须整理类之间调用关系,不可产生循环调用。同理,对于当两个类A和B分别定义在各自的hpp文件中,形如以下的循环调用也将导致编译错误:
//a.hpp
#include "b.hpp"
class A{
public:
void someMethod(B b);
};
//b.hpp
#include "a.hpp"
class B{
public:
void someMethod(A a);
};
3、不可使用静态成员。
静态成员的使用限制在于如果类含有静态成员,则在hpp中必需加入静态成员初始化代码, 当该hpp被多个文档include时,将产生符号重定义错误。唯一的例外是const static整型成员,因为在vs2003中,该类型允许在定义时初始化,如:
class A{
public:
const static int intValue = 123;
};
由于静态成员的使用是很常见的场景,无法强制清除,因此可以考虑以下几种方式(以下示例均为同一类中方法)
1.类中仅有一个静态成员时,且仅有一个调用者时,可以通过局域静态变量模拟
//方法模拟获取静态成员
someType getMember()
{
static someType value(xxx); //作用域内静态变量
return value;
}
2.类中有多个方法需要调用静态成员,而且可能存在多个静态成员时,可以将每个静态成员封装一个模拟方法,供其他方法调用。
someType getMemberA()
{
static someType value(xxx); //作用域内静态变量
return value;
}
someType getMemberB()

{
static someType value(xxx); //作用域内静态变量
return value;
}
void accessMemberA()

{
someType member = getMemberA(); //获取静态成员
};
    //获取两个静态成员
void accessStaticMember()
{
someType a = getMemberA(); //获取静态成员
       someType b = getMemberB();
};
3.第二种方法对于大部分情况是通用的,但是当所需的静态成员过多时,编写封装方法的工作量将非常巨大,在此种情况下,建议使用Singleton模式,将被调用类定义成普通类,然后使用Singleton将其变为全局唯一的对象进行调用。
如原h+cpp下的定义如下:
class A{
public:
type getMember(){
return member;
}
static type member; //静态成员
}
采用singleton方式,实现代码可能如下(singleton实现请自行查阅相关文档)
    //实际实现类
class Aprovider{
public:
type getMember(){
return member;
}
        type member; //变为普通成员
}
    //提供给调用者的接口类
class A{
public:
type getMember(){
return Singleton< AProvider>::getInstance()->getMember();
}
}

4、是Header Plus Plus 的简写

5、与*.h类似,hpp是C++程序头文件 。

6、是VCL专用的头文件,已预编译(不会重复编译)

7、是一般模板类的头文件。

8、一般来说,.h里面只有声明,没有实现,而*.hpp里声明实现都有,后者可以减少.cpp的数量

9、.h里面可以有using namespace std,而.hpp里则无

关于C++中.hpp文件的写法相关推荐

  1. C++中hpp文件浅析

    定义 hpp,是Header Plus Plus的简写,与.h类似,.hpp是C++程序头文件格式,其实质就是将.cpp的实现代码混入.h头文件当中. 定义与实现都包含在同一文件,则该类的调用者只需要 ...

  2. modelsim仿真中 do文件的写法技巧

    Modelsim之 DO文件简介 网上的关于DO文件的编写好像资料不多,比较杂,所以本人总结一下常用的简单语法,方便大家查看.其实本人也刚接触DO文件没多久,有纰漏很正常,欢迎指正批评,互相学习.PS ...

  3. qt中.pro文件详细说明

    工程上需要使用QT框架进行项目开发,.pro文件里面的具体配置方式比较模糊.详细整理文件里各配置项的含义,并对其编写方法进行归纳总结. 目录 1.配置项说明 1.1.注释 # 1.2.添加/排除QT项 ...

  4. QT中PRO文件写法的详细介绍

    在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的,.pro文件的写法如下: 1. 注释 从"#"开始,到这一行结束. 2.模板变量告诉q ...

  5. QT中PRO文件写法的详细介绍,很有用,很重要!

    在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的,.pro文件的写法如下: 1. 注释 从"#"开始,到这一行结束. 2.模板变量告诉q ...

  6. QT中PRO文件写法

    在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的,.pro文件的写法如下: 1. 注释 从"#"开始,到这一行结束. 2.模板变量告诉q ...

  7. c++中什么时候使用.hpp文件

    分文件编写类模板 类模板的声明和定义要写在一个.hpp文件中,声明和定义不可以分开,因为分文件的话,main.cpp中只引入.h,在类模板进行二次编译的时候,无法找到类的定义,会出错.所以要将其声明和 ...

  8. C++中的.hpp文件与.h文件

    在查阅ASN-GW工程文件源代码的时候,发现了*.hpp文件,很奇怪,以前在教科书都没有学习过,在baidu一下,发现了一下要点: 1.是Header   Plus   Plus 的简写. 2.与*. ...

  9. C++ 中头文件(.h)和源文件(.cc)的写法简述

    C++ 中头文件(.h)和源文件(.cc)的写法简述 用C++编写比较大型的项目时,文件的分割管理确实确实是非常必要的 .下面就非常简洁明了地谈谈头文件(.h)和源文件(.cc)应该怎么写. 头文件( ...

最新文章

  1. Windows安装MongoDB
  2. forward 和redirect的区别
  3. 有三AI 1000问回归,备战秋招,更多,更快,更好,等你来战!
  4. 最小拍有纹波系统仿真实验matlab代码,最小拍控制器设计.doc
  5. 深入浅出之函数的参数传递方式
  6. LeetCode 1093. 大样本统计
  7. nhibernate GetType
  8. c# 以太坊代币_C代币
  9. addEventListener:为单个事件注册多个事件事件处理程序
  10. 【Java】JavaWeb概述
  11. 联想笔记本怎么进入pe系统_联想笔记本电脑怎么进入PE?
  12. 2016年不可错过的21个深度学习视频、教程和课程
  13. 基于文本检测模型检测文本框对图像进行旋转校正
  14. vue项目结合iview4UI组件实现树状结构及复杂动态表头列表 Tree-Table 及复杂header 省市区树状表格联动 数据优化后台一次性返回一万条数据页面卡死问题
  15. uniaccess安全助手卸载
  16. 多组两两比较用什么检验方法_手把手教你多组独立样本的非参数检验及两两比较...
  17. python自动读取excel文件邮箱列表,自动批量发送邮件项目(附使用方法+代码)
  18. s32k118CAN通信问题
  19. python信息采集管理系统_基于Python的求职信息采集分析系统设计与实现
  20. 碳足迹-ISO14064认证

热门文章

  1. Java算法题:利用字母可以组成一些美丽的图形,下面给出了一个例子:
  2. 抖音和快手的挣钱模式,你知道吗?
  3. stc15 — 点亮第一个LED灯
  4. 基于VUE的电商系统的设计与实现
  5. 2023秋招中原银行算法工程师面试分享
  6. CSS 自适应布局(flex布局)
  7. 九齐单片机 , 使用了未定义的符号“STK03”(13010) ,取正 / 符号出错
  8. layui让当前页面刷新_layui怎么刷新当前页面
  9. 小新Air14(2019)如何快速修复网络
  10. Black Rock Shooter