`
lxy2330
  • 浏览: 469368 次
  • 性别: 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();

        }

    }

分享到:
评论

相关推荐

    json.hpp json库,无需添加依赖库,单个文件,C++可调用

    json.hpp json库,无需添加依赖库,单个文件,C++可调用。自己备份

    c++中的.hpp文件

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

    PCL库中的 ndt.h 和 ndt.hpp

    在PCL的早期版本(1.7.2及更早版本)中,`ndt.h`和`ndt.hpp`这两个文件并不包含在标准库中,但它们在进行三维匹配和定位等任务中起着关键作用。本文将深入探讨这两个文件所代表的NDT(Normal Distributions ...

    hpp转化器 第二期

    .hpp转化器的工作原理可能是读取.hpp文件中的内容,然后依据C++语法解析出函数声明、类定义等信息,并分别写入到.h和.cpp文件中。.h文件通常只包含函数和类的声明,而.cpp文件则包含对应的函数实现。这个工具可能还...

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

    1. **C++编程规范**:C++中通常将接口定义(如类声明、函数原型)放在头文件(.h 或 .hpp)中,而具体实现则放在对应的实现文件(.cpp)中,这种做法有助于代码组织和模块化。 2. **头文件与实现文件**:头文件主要...

    VC读取JPG的EXIF信息的一个类

    "VC读取JPG的EXIF信息的一个类"这个标题表明,这是一个专为Visual C++开发的工具,可以方便地集成到其他VC++项目中,帮助开发者获取并处理JPEG文件的元数据。 描述中提到“很好用很强大”,意味着这个类库不仅实现...

    vc++iostream.h&fstream;.h.rar

    这是因为`.h`扩展名通常与C库的头文件关联,而C++库的头文件应该使用`.hpp`或不带扩展名的形式。所以,如果你尝试在这些版本的Visual Studio中直接包含`iostream.h`或`fstream.h`,编译器会报错。 在描述中提到的...

    hpp转化器第三期

    在C++编程中,hpp文件通常作为头文件使用,包含类定义、函数声明、枚举、宏和其他非实现元素。开发者通常将代码逻辑分离到cpp(实现文件)和hpp(接口文件)中,以提高代码的组织性和可读性。"hpp转化器"可能是一个...

    汉字转拼音C++版本,提供头文件和实现文件

    这里我们关注的是一个特定的C++实现,它提供了两个文件——`Pinyin.cpp`和`Pinyin.h`,用于实现汉字转拼音的功能。 `Pinyin.cpp`是实现文件,通常包含了函数的定义和类的成员函数的实现。在这个案例中,这个文件...

    新建压缩文件,新建压缩文件夹,C,C++源码.zip

    源码文件在压缩包中可能按照项目结构组织,例如,每个源文件对应一个功能模块,头文件(.h或.hpp)包含接口声明,而源文件(.c或.cpp)实现这些接口。此外,还可能包含Makefile或构建脚本,用于编译和链接源代码,...

    c++编写的 矩阵 matrix 类源码

    在C++编程中,矩阵操作是一项常见的任务,特别是在科学计算、图像处理和游戏开发等领域。这里我们关注的是一份名为“matrix”的自定义C++类,它提供了对矩阵进行基本运算的功能,包括加减法、乘法以及矩阵的逆运算。...

    C++笔试.zip_C++_C++笔试题

    14. **编译与链接**:编译器的基本使用,头文件(.h与.hpp的区别),编译选项,链接过程。 15. **设计模式**:虽然不是语言特性,但在面试和笔试中常常出现,如工厂模式、单例模式、观察者模式等。 通过深入学习...

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

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

    C++编写的demo代码,包括使用QT、Boost等其他C++库.zip

    通常,一个C++项目会包含头文件(.h或.hpp)、源文件(.cpp)和项目配置文件(如.pro或CMakeLists.txt)。头文件定义了类和函数,源文件实现了这些定义,而配置文件则指示构建系统如何编译和链接这些文件。 为了更...

    ts24.lib文件下载 免费提供

    `.lib` 文件在Windows操作系统中广泛使用,尤其是在C++编程中,它包含了预编译的函数和对象代码,使得开发人员可以将这些功能集成到他们的应用程序中而无需再次编译源代码。`.lib` 文件有两种类型:静态库和导入库。...

    源程序,源程序是什么意思,C,C++源码.zip

    在C和C++项目中,可能有头文件(如.h或.hpp)和实现文件(如.c或.cpp)。头文件通常包含函数原型、类声明和其他接口定义,而实现文件则包含具体的函数实现和类的成员函数。 当源程序准备编译时,开发人员会使用...

    hpp文件转化器

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

    C++项目开发.docx

    在C++项目中,开发代码通常涉及多个文件和组件,包括源文件(.cpp)、头文件(.h 或 .hpp)、可能的项目配置文件(如Makefile、CMakeLists.txt)、以及可能的其他资源文件。下面是一个简单的C++项目示例,该项目包含...

    C++解析XML.zip

    在C++编程中,解析XML文件是一项重要的任务,用于从XML文档中提取所需信息。本教程将深入探讨如何在C++中解析XML,主要涉及两种常用的库:TinyXML和RapidXML。 首先,我们来看TinyXML库。TinyXML是C++的一个轻量级...

Global site tag (gtag.js) - Google Analytics