`
lxy2330
  • 浏览: 459814 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多

      1、是Header   Plus   Plus 的简写。

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

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

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

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

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

7、*.hpp要注意的问题有:

      a)不可包含全局对象和全局函数

     由于hpp本质上是作为.h被调用者include,所以当hpp文件中存在全局对象或者全局函数,而该hpp被多个

    调用者include时,将在链接时导致符号重定义错误。要避免这种情况,需要去除全局对象,将全局函数封

    装为类的静态方法。

      b)类之间不可循环调用

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

    }

      c)不可使用静态成员

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

    class A{

    public:

       const static int intValue = 123;

    };

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

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

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

    someType getMember()

    {

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

       return value;

    }

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

 

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

    };

 

    三、第二种方法对于大部分情况是通用的,但是当所需的静态成员过多时,编写封装方法的工作量将非常

    巨大,在此种情况下,建议使用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();

        }

    }

分享到:
评论

相关推荐

    c++中的.hpp文件

    hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该cpp文件即可,无需再 将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再...

    PCL库中的 ndt.h 和 ndt.hpp

    压缩文件包含ndt.h 和 ndt.hpp。 低版本PCL库(1.7.2之前)不包含ndt.h 和 ndt.hpp,有时却要用到。所以分享给朋友们。

    CppFileCreator:将 .hpp.h 转换为 .cpp !

    Cpp文件创建器 这是我用来将 .hpp/.h 文件转换为 .cpp 文件的程序的来源:) 如何使用 请参阅此处的教程: :

    wavecar.hpp:一个C ++库,用于从VASP中读取和操作WAVECAR文件

    Wavecar.hpp 介绍 该程序包实现了一个C ++ 11的仅标头库,用于读取VASP5格式的WAVECAR文件。 它是作为一个识字程序编写的,因此我们将尝试将文档和代码保存在同一位置。 为方便起见,您可以在include目录中找到...

    hpp文件转化器

    hpp在C++中的含义 hpp,其实质就是将。cpp的实现代码混入。h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,这是把hpp文件转化h和cpp的工具,linux平台

    大学四年里编写的c或c++的代码.rar

    同一个程序中,可以同时使用C和C++编写代码,而且可以相互调用。 1. C++中调用C代码 这是最常用的情景,只需要在C++中用extern "C"包含C头文件即可。例如: extern "C“{ #include "stdio.h" } 2. C调用C++代码...

    文件编码转换脚本 v2.0 — 解决Source Insight等显示中文乱码

    解决Source Insight 等中文...特点:此脚本会递归地转换所在目录及子目录下的所有 .c、.cpp、.cxx、c++、.h、.hpp、.hxx 等后缀文件(忽略大小写)。 使用方法:拷贝此脚本到目标目录,然后执行即可(须有可执行权限)。

    argparse:现代C ++的参数解析器

    单头文件 需要C ++ 17 麻省理工学院执照 快速开始 只需包括argparse.hpp就可以了。 # include 要开始解析命令行参数,请创建ArgumentParser 。 argparse::ArgumentParser program ( " program name " ); 注意...

    C++EasyX图形库png格式图片实现透明贴图源代码及使用方法

    hpp是算法文件!!! 算法主要利用把像素的颜色拆解出来 ARGB,之后获取每一个像素点的颜色值,并且把色彩图转成黑白图,通过黑白图求3-4个颜色的平均值实现png图片的透明贴图效果。 算法还可以实现修正贴图的位置,...

    LuaBind 源码 (Lua增强库)

    出于某种原因需要包含其他的Lua头文件,你可以修改此文件. 5.1 Hello World 新建一个控制台DLL工程, 名字是 luabind_test. #include #include &lt;luabind/luabind.hpp&gt; #include &lt;luabind/lua_include.hpp&gt; extern ...

    FixedPoint:C++ 中的定点算法库

    定点库这是一个简单的库,以 2 个 hpp 文件的形式提供程序定点功能。 它的设计目的是在没有浮点单元的嵌入式环境中使用,因此定点运算效率更高。 了解该库的最佳方式是阅读examples.hpp 。概述定点运算的问题在于...

    定制版LightGBM

    本文件主要基于微软开源的LightGBM项目,对其中的application.h,application.hpp,predictor.hpp文件进行修改,添加用于实时预测的C++ API ,方便用户部署预测速度飞快的C/C++线上预测模型。

    C++Primer中文版(第四版)题解整理.doc

    一般而言,C++编译器要求待编译的程序保存在文件中。C++程序中一般涉及两 类文件:头文件和源文件。大多数系统中,文件的名字由文件名和文件后缀(又 称扩展名)组成。文件后缀通常表明文件的类型,如头文件的后缀...

    一个Lex/Yacc完整的示例(可使用C++)

    (2) 自动调用bison编译.y文件,生成yacc.tab.c和yacc.tab.h文件。 (3) 自动调用g++编译、链接出可执行文件main。 (4) 自动执行main,得到如下结果:。 bison -d yacc.y g++ -c lex.yy.c g++ -c yacc.tab.c g++ lex....

    database_server.zip

    C++17 makefile 文件列表 data_table.hpp databases.sql main.cpp Makefile mysql.hpp mysql_async_callback.cpp mysql_async_callback.h mysql_daemonize.h mysql_mgr.cpp mysql_mgr.h mysql_oper_define.h mysql_...

    [原创]自己工作中常用的模板库,简化你的工作

    (每个功能文件.\CodeLib\include\MiniMPL\xxx.hpp,都对应一个测试文件.\CodeLib\testcase\MiniMPL\test_xxx.hpp) (这个库的使用及修改是完全自由的,只需要保留文件头中的注释即可) usage: download this library, ...

    boost开源代码

    Boost库文件采用的.hpp的后缀,而不是分成两个文件,也就是”.h+.cpp”,之所以这样做是有理由的,首先就是与普通的C/C++头文件区分,另外一个原因就是使Boost库不需要预先编译,直接引用程序员的工程即可编译链接,...

    SynCode Exporter(语法突出格式刷) v1.3

    目前共支持 22 中开发语言和代码文件类型:  1、C++ (*.c;*.cpp;*.h;*.hpp)  2、Fortran (*.for)  3、Java (*.java)  4、Pascal (*.pas;*.dpr;*.dpk)  5、Visual Basic (*.bas)  6、x86 Assembly (*.ASM)  7...

    classy:一个简单的C ++类层次分析器

    classy directory ClassName :输出类ClassName下的类的类树,该类树是从指定目录中的所有.h和.hpp文件中提取的。 示例输出 Classy提供彩色输出和很酷的嵌套格式。 颜色使Classy的输出易于阅读。 Event class ...

    opencv代码示例

    /图像采集与预处理部分 #include #include &lt;opencv2/core/core.hpp&gt; #include ...#include "cv.h"//算法函数文件 #include &lt;opencv2/imgproc/imgproc.hpp&gt; #include &lt;cxcore.h&gt; //封装图像处理 类

Global site tag (gtag.js) - Google Analytics