赞
踩
hpp文件是C++程序中一种特殊头文件,它可以包含类的声明和实现。与传统的h文件相比,hpp文件具有以下特点:
与传统的h文件相比,hpp文件有很多优点,但是在编写hpp文件时也需要注意以下事项:
由于hpp文件本质上是作为h文件被调用者include,所以当hpp文件中存在全局对象或者全局函数,而该hpp被多个调用者include时,将在链接时导致符号重定义错误。要避免这种情况,需要去除全局对象,将全局函数封装为类的静态方法。
// 错误示例 #include <iostream> int g_val = 0; // 全局对象 void print_val() { std::cout << g_val << std::endl; } // 正确示例 #include <iostream> class MyClass { public: void print_val() { std::cout << m_val << std::endl; } private: int m_val = 0; // 类成员 };
如果hpp文件中包含多个类,并且这些类之间存在相互依赖关系,那么在编译时会导致循环依赖错误。为了避免这种情况,需要对类之间的依赖关系进行合理的设计,避免循环调用。
// 错误示例 #include <iostream> class A { public: void foo(B& b) { // ... } }; class B { public: void bar(A& a) { // ... } }; // 正确示例 #include <iostream> class A { public: void foo(B* b) { // ... } }; class B { public: void bar(A* a) { // ... } };
hpp文件中的静态成员在编译时会被编译到调用者的obj文件中,这会导致多个调用者共享同一个静态成员。如果静态成员发生变化,则会导致所有调用者都受到影响。因此,在hpp文件中应避免使用静态成员。
// 错误示例 #include <iostream> class MyClass { public: static int s_val = 0; // 静态成员 void print_val() { std::cout << s_val << std::endl; } }; // 正确示例 #include <iostream> class MyClass { public: void print_val() { int val = 0; // 局部变量 std::cout << val << std::endl; } };
// 示例 #include <iostream> #include <vector> #pragma once using namespace std; class MyClass { public: void print_val() { cout << m_val << endl; } private: int m_val = 0; };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。