C++类含其他头文件类型成员时如何避免在file.h中引入额外头文件
解决方案:使用Pimpl(指向实现的指针)设计模式
核心思路是将类的私有实现细节完全隐藏到cpp文件中,头文件仅暴露公共接口,完全不需要引入<vector>、<map>等依赖头文件,同时还能降低头文件变更带来的编译依赖。
修改后的file.h代码
#ifndef __FILE_H__ #define __FILE_H__ class foo { private: // 仅前置声明实现类,不需要引入任何依赖头文件 class Impl; Impl* p_impl; public: foo(); ~foo(); void bar(); }; #endif
修改后的file.cpp代码
#include "file.h" // 所有依赖头文件仅在cpp中引入 #include <vector> #include <map> // 实现类定义完全放在cpp中,对外部不可见 class foo::Impl { public: std::vector<int> vector; // 对应原代码的Vector成员 std::map<int, int> map; // 对应原代码的Map成员 }; foo::foo() : p_impl(new Impl()) {} foo::~foo() { delete p_impl; } void foo::bar() { // 通过p_impl访问内部成员即可 // 示例操作:p_impl->vector.push_back(1); // 示例操作:p_impl->map.insert({1, 2}); }
注意事项
- 如果使用C++11及以上版本,推荐用
std::unique_ptr<Impl>替代裸指针管理内存,此时需要在头文件中声明~foo();,且不能在头文件中用= default默认实现,必须在cpp文件中定义析构函数,否则会因为Impl类型不完整触发unique_ptr删除器的编译错误。 - 原main.cpp中
#inclue "file.h"存在笔误,修正为#include "file.h"后即可正常使用,原有使用逻辑不需要做任何调整。 - 该方案除了消除头文件依赖外,还能保证ABI兼容性,只要公共接口不变,修改Impl内部的成员不会影响外部编译产物。
内容的提问来源于stack exchange,提问作者spaL
相关产品推荐
相关产品推荐

