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();
}
}
分享到:
相关推荐
hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该cpp文件即可,无需再 将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再...
压缩文件包含ndt.h 和 ndt.hpp。 低版本PCL库(1.7.2之前)不包含ndt.h 和 ndt.hpp,有时却要用到。所以分享给朋友们。
Cpp文件创建器 这是我用来将 .hpp/.h 文件转换为 .cpp 文件的程序的来源:) 如何使用 请参阅此处的教程: :
Wavecar.hpp 介绍 该程序包实现了一个C ++ 11的仅标头库,用于读取VASP5格式的WAVECAR文件。 它是作为一个识字程序编写的,因此我们将尝试将文档和代码保存在同一位置。 为方便起见,您可以在include目录中找到...
hpp在C++中的含义 hpp,其实质就是将。cpp的实现代码混入。h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,这是把hpp文件转化h和cpp的工具,linux平台
同一个程序中,可以同时使用C和C++编写代码,而且可以相互调用。 1. C++中调用C代码 这是最常用的情景,只需要在C++中用extern "C"包含C头文件即可。例如: extern "C“{ #include "stdio.h" } 2. C调用C++代码...
解决Source Insight 等中文...特点:此脚本会递归地转换所在目录及子目录下的所有 .c、.cpp、.cxx、c++、.h、.hpp、.hxx 等后缀文件(忽略大小写)。 使用方法:拷贝此脚本到目标目录,然后执行即可(须有可执行权限)。
单头文件 需要C ++ 17 麻省理工学院执照 快速开始 只需包括argparse.hpp就可以了。 # include 要开始解析命令行参数,请创建ArgumentParser 。 argparse::ArgumentParser program ( " program name " ); 注意...
hpp是算法文件!!! 算法主要利用把像素的颜色拆解出来 ARGB,之后获取每一个像素点的颜色值,并且把色彩图转成黑白图,通过黑白图求3-4个颜色的平均值实现png图片的透明贴图效果。 算法还可以实现修正贴图的位置,...
出于某种原因需要包含其他的Lua头文件,你可以修改此文件. 5.1 Hello World 新建一个控制台DLL工程, 名字是 luabind_test. #include #include <luabind/luabind.hpp> #include <luabind/lua_include.hpp> extern ...
定点库这是一个简单的库,以 2 个 hpp 文件的形式提供程序定点功能。 它的设计目的是在没有浮点单元的嵌入式环境中使用,因此定点运算效率更高。 了解该库的最佳方式是阅读examples.hpp 。概述定点运算的问题在于...
本文件主要基于微软开源的LightGBM项目,对其中的application.h,application.hpp,predictor.hpp文件进行修改,添加用于实时预测的C++ API ,方便用户部署预测速度飞快的C/C++线上预测模型。
一般而言,C++编译器要求待编译的程序保存在文件中。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....
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库文件采用的.hpp的后缀,而不是分成两个文件,也就是”.h+.cpp”,之所以这样做是有理由的,首先就是与普通的C/C++头文件区分,另外一个原因就是使Boost库不需要预先编译,直接引用程序员的工程即可编译链接,...
目前共支持 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 directory ClassName :输出类ClassName下的类的类树,该类树是从指定目录中的所有.h和.hpp文件中提取的。 示例输出 Classy提供彩色输出和很酷的嵌套格式。 颜色使Classy的输出易于阅读。 Event class ...
/图像采集与预处理部分 #include #include <opencv2/core/core.hpp> #include ...#include "cv.h"//算法函数文件 #include <opencv2/imgproc/imgproc.hpp> #include <cxcore.h> //封装图像处理 类