文档章节

c++的.hpp替代。h+.cpp的结构

我就是小在
 我就是小在
发布于 2015/06/12 08:32
字数 1154
阅读 38
收藏 0

稍微看了下.hpp的东西,似乎还是有一点区别的。但是vs2013貌似没有提供.hpp的代码检查,新建项目里只有.hpp和.cpp。这样,我是要按照原来分开的结构写,在复制粘贴打到.hpp里去吗?呜呜,但是,有区别啊。下面无耻抄下百度的东东。


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

1、是Header Plus Plus 的简写。

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

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

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

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

2注意问题编辑

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

}

}



本文转载自:http://baike.baidu.com/link?url=Yv-zqA2OHDvfpMGsoZTYIv9TxVSUt4lsZ6LizXT4VPkctNCP5_qvxgJAR3-euBZFt...

共有 人打赏支持
我就是小在
粉丝 0
博文 2
码字总数 94
作品 0
徐汇
私信 提问
Linux应用程序Makefile模版

本文在 http://sourceforge.net/projects/gcmakefile/ 的成果上改进得来。 主要修改如下: 1.去掉了说明部分,使得模版更简洁; 模版本身已经具备自说明特性。 2.去掉自动生成目标名称部分;...

索隆
2012/04/24
0
0
DEV C++ linker error问题 多文件联合编译

stack.hpp文件 /*-------------------------------------------------------------- Header file--This file contain declarations for class stack. (c++) Written by: Date:2012-10-09 --......

Gavin1024
2012/10/09
1K
2
新人求帮助C++的hpp和cpp文件问题

//bigint.hpp #ifndef BIGINT_HPP #define BIGINT_HPP #include class bigint{ public: int dist(int num); }; #endif //bigint.cpp #include #include "bigint.hpp" using namespace std; i......

叶新元
2016/02/02
632
4
C++17 标准正式发布:开发者可更简单地编写和维护代码

昨日,ISO C++ 委员会正式发布了 C++ 17 标准,正式名称为 ISO/IEC 14882:2017。 基于 C++ 11,C++ 17 旨在使 C++ 成为一个不那么臃肿复杂的编程语言,以简化该语言的日常使用,使开发者可以...

局长
2017/12/06
7.5K
43
hpp文件互相引用导致编译失败

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

Cloudox_
08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周二乱弹 —— 其实我在地板也睡不着

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @witt-z :分享歌词: 阴天 在不开灯的房间,当所有思绪都一点一点沉淀。 分享莫文蔚的单曲《阴天》: 《阴天》- 莫文蔚 手机党少年们想听歌,...

小小编辑
10分钟前
11
3
微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
3
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
4
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部