一、hpp 干啥的?
二、hpp使用场景:类模板
1、遇到问题:
类模板中成员函数的创建时机是在调用阶段,
导致分文件编写时(仅区分 *.h 和 *.cpp )链接不到,报错。

讯享网
2、解决方式(主流):
person.hpp 代码( 不再需要 person.h ,相当于取代 person.h 了 ):
#pragma once #include <iostream> using namespace std; #include <string> template<class T1, class T2> class Person {
public: Person(T1 name, T2 age); void showPerson(); public: T1 m_Name; T2 m_Age; }; //构造函数 类外实现 template<class T1, class T2> Person<T1, T2>::Person(T1 name, T2 age) {
this->m_Name = name; this->m_Age = age; } //成员函数 类外实现 template<class T1, class T2> void Person<T1, T2>::showPerson() {
cout << "姓名: " << this->m_Name << " 年龄:" << this->m_Age << endl; }
讯享网
类模板分文件编写 .cpp 中代码:
讯享网#include<iostream> using namespace std; //主流解决方式:将声明和实现写到一起,文件后缀名改为 .hpp #include "person.hpp" int main() {
Person<string, int> p("Tom", 10); p.showPerson(); return 0; }
三、hpp 的优点
这样代码实现会直接编译到调用者的 obj 文件中,而不再生成单独的 obj,
采用 hpp 将大幅度减少调用 project 中的 cpp 文件数与编译次数,
也不用再发布 lib 与 dll,因此非常适合用来编写公用的开源库。

四、hpp 使用注意
1、与 *.h 类似,hpp 是 C++ 程序头文件 ( #include < *.hpp>);
2、VCL专用的头文件,已预编译;
3、是一般模板类的头文件;
4、一般而言,*.h 里面只有声明,没有实现,而 *.hpp 里声明实现都有,后者可以减少.cpp的数量;
5、*.h 里面可以有 using namespace std,而 *.hpp 里面没有。
6、不可包含全局对象和全局函数。
由于 hpp 本质上是作为 .h 被调用者 include,
所以当 hpp 文件中存在全局对象或者全局函数,而该 hpp 被多个调用者 include 时,
将在链接时导致符号重定义错误。
要避免这种情况,
需要去除全局对象,将全局函数封装为类的静态方法。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/123832.html