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的数量。
6、*.h里面可以有using namespace std,而*.hpp里则无。
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); };
class A{ public: const static int intValue = 123; };
//方法模拟获取静态成员 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(); };
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://www.cnblogs.com/rainbow70626/p/7586705.html