文档章节

hpp文件

AndyZhouX
 AndyZhouX
发布于 2017/09/02 09:33
字数 1026
阅读 4
收藏 0
C++

hpp,顾名思义等于.h加上.cpp,在boost、Xerces等开源库中频繁出现,偶在机缘巧合之下,学得一招半式,遂记录如下,以供参考学习。

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

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

        }

    }

本文转载自:http://blog.csdn.net/shinehoo/article/details/6317747

共有 人打赏支持
AndyZhouX
粉丝 2
博文 151
码字总数 102410
作品 0
深圳
程序员
私信 提问
py-faster-rcnn +cudnn V5

转载自http://blog.csdn.net/u010733679/article/details/52221404,经过实际操作,采用了第二种手动替换代码文件、修改个别函数名的方式,成功编译。 ---- 原文 ----- faster rcnn 代码默认...

lovedan
2016/11/24
0
0
hpp文件互相引用导致编译失败

写代码的时候写了两个互相引用的HPP文件。 之所以写成HPP文件是为了方便,毕竟代码量都不大,觉得弄成.h和.cpp两个文件比较麻烦,但是却带来了意想不到的其他麻烦。 因为功能需要,两个.hpp文...

Cloudox_
2018/08/22
0
0
boost库之时间和日期

最近在学习boost库,想来对C++了解的人,应该都不陌生吧,以前没怎么注意过,也从来把注意力放到数据结构和算法这一块,结果,一上班就被虐的的体无完肤,从而决心把boost过一遍,趁着之前还...

风雅轩
2017/10/28
0
0
Linux上Oracle错误日志

红旗Linux上一个Oracle节点报告的错误信息如下: kernel: pciehp: acpi_pciehprm:\_SB_.PCI0.PT04.S2E0.S2E9 _HPP fail=0x5 Apr 15 14:32:04 db1 o2cb: Loading module "configfs": Apr 15 ......

yzpc
2013/04/17
1K
1
simhash算法库--simhash

专门针对中文文档的simhash算法库 简介 此项目用来对中文文档计算出对应的 simhash 值。 simhash 是谷歌用来进行文本去重的算法,现在广泛应用在文本处理中。 详见SimhashBlog 特性 使用 Cp...

吴延毅
2014/12/13
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql 查询当天、本周,本月,上一个月的数据

今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 近7天 SELECT * FROM 表名 wher......

BraveLN
18分钟前
1
0
Android Multimedia框架总结(六)C++中MediaPlayer的C/S架构

前面几节中,都是通过java层调用到jni中,jni向下到c++层并未介绍 看下Java层一个方法在c++层 MediaPlayer后续过程 frameworks/av/media/libmedia/MediaPlayer.cpp 找一个我们之前熟悉的setDa...

天王盖地虎626
36分钟前
1
0
【Linux】【MySQL】CentOS7安装最新版MySQL8.0.13(最新版MySQL从安装到运行)

1、前言   框框博客在线报时:2018-11-07 19:31:06   当前MySQL最新版本:8.0.13 (听说比5.7快2倍)   官方之前表示:MySQL 8.0 正式版 8.0.11 已发布,MySQL 8 要比 MySQL 5.7 快 2 ...

Code辉
36分钟前
0
0
oracle dg备库重建redolog:ora-00313,ora-00312

trace文件: Errors in file /crbank/dbs/app/product/diag/rdbms/rdbs/dbs/trace/dbs_mrp0_24445130.trc: ORA-00313: open failed for members of log group 8 of thread 1 ORA-00312: onl......

hnairdb
50分钟前
1
0
深入分析Java I/O的工作机制 (一)

1.Java的I/O类库的基本架构 先说一下什么是类库:可以说是类的集合,类库包括接口、抽象类、具体类等。 I/O是机器获取和交互信息的主要渠道。 java在I/O上也一直在做持续的优化,在1.4版开始...

java菜分享
59分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部