相关文章推荐
玩命的猴子  ·  Reusable ...·  8 月前    · 
伤情的创口贴  ·  王传福力挺的智驾独角兽冲刺IPO·  1 年前    · 
年轻有为的签字笔  ·  Lightgbm基本原理介绍-CSDN博客·  1 年前    · 
任性的西红柿  ·  opencv3学习:reshape函数 - ...·  1 年前    · 
伤情的消防车  ·  漫画全集在线观看 - 哔哩哔哩漫画·  2 年前    · 
Code  ›  hpp头文件与h头文件的区别 C++中的.hpp文件开发者社区
include 静态成员
https://cloud.tencent.com/developer/article/1531818
英姿勃勃的墨镜
2 年前
作者头像
acoolgiser
0 篇文章

hpp头文件与h头文件的区别 C++中的.hpp文件

前往专栏
腾讯云
备案 控制台
开发者社区
学习
实践
活动
专区
工具
TVP
文章/答案/技术大牛
写文章
社区首页 > 专栏 > acoolgiser_zhuanlan > 正文

hpp头文件与h头文件的区别 C++中的.hpp文件

发布 于 2019-11-03 12:18:28
2.3K 0
举报

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

hpp的优点不少,但是编写中有以下几点要注意:

1 、是Header Plus Plus 的简写。

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

3、 是 VC L专用的头文件,已预编译。

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

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

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

7、不可包含全局对象和全局函数。

由于hpp本质上是作为.h被调用者include,所以当hpp文件中存在全局对象或者全局函数,而该hpp被多个调用者include时,将在链接时导致符号重定义错误。要避免这种情况,需要去除全局对象,将全局函数封装为类的静态方法。

8、类之间不可循环调用。

在.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);

};

9、不可使用静态成员。

静态成员的使用限制在于如果类含有静态成员,则在hpp中必需加入静态成员初始化代码,当该hpp被多个文档include时,将产生符号重定义错误。唯一的例外是const static整型成员,因为在vs2003中,该类型允许在定义时初始化,如:

class A{

public:

const static int intValue = 123;

};

由于静态成员的使用是很常见的场景,无法强制清除,因此可以考虑以下几种方式(以下示例均为同一类中方法)

1.类中仅有一个静态成员时,且仅有一个调用者时,可以通过局域静态变量模拟

//方法模拟获取静态成员

someType getMember()

{

static someTypevalue(xxx);//作用域内静态变量

return value;

}

2.类中有多个方法需要调用静态成员,而且可能存在多个静态成员时,可以将每个静态成员封装一个模拟方法,供其他方法调用。

someType getMemberA()

{

static someTypevalue(xxx);//作用域内静态变量

return value;

}

someType getMemberB()

{

static someTypevalue(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();

}

}

点击展开阅读全文
文章分享自:
作者个人站点/博客
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

原始发表:2019-10-31 , 如有侵权请联系 cloudcommunity@tencent.com 删除

打包
c++
c#
登录 后参与评论
关于作者
0
文章
0
累计阅读量
0
获赞
前往专栏
关注 - 腾讯云 开发者 公众号
将获得
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
扫码关注腾讯云开发者
NEW
切换旧版
领券
  • 社区

    • 专栏文章
    • 阅读清单
    • 互动问答
    • 技术沙龙
    • 技术视频
    • 团队主页
    • 腾讯云TI平台
  • 活动

    • 自媒体分享计划
    • 邀请作者入驻
    • 自荐上首页
    • 技术竞赛
  • 资源

    • 技术周刊
    • 社区标签
    • 开发者手册
    • 开发者实验室
  • 关于

    • 社区规范
    • 免责声明
    • 联系我们
    • 友情链接

腾讯云开发者

扫码关注腾讯云开发者

扫码关注腾讯云开发者

领取腾讯云代金券

热门产品

  • 域名注册
  • 云服务器
  • 区块链服务
  • 消息队列
  • 网络加速
  • 云数据库
  • 域名解析
  • 云存储
  • 视频直播

热门推荐

  • 人脸识别
  • 腾讯会议
  • 企业云
  • CDN加速
  • 视频通话
  • 图像分析
  • MySQL 数据库
  • SSL 证书
  • 语音识别

更多推荐

  • 数据安全
  • 负载均衡
  • 短信
  • 文字识别
  • 云点播
  • 商标注册
  • 小程序开发
  • 网站监控
  • 数据迁移

Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有

深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569

腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287

问题归档 专栏文章 快讯文章归档 关键词归档 开发者手册归档 开发者手册 Section 归档
 
推荐文章
玩命的猴子  ·  Reusable Multithreaded TCP/IP Client and Server Classes with Example Project in VB.NET- CodeProject
8 月前
伤情的创口贴  ·  王传福力挺的智驾独角兽冲刺IPO
1 年前
年轻有为的签字笔  ·  Lightgbm基本原理介绍-CSDN博客
1 年前
任性的西红柿  ·  opencv3学习:reshape函数 - denny402 - 博客园
1 年前
伤情的消防车  ·  漫画全集在线观看 - 哔哩哔哩漫画
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号