做过C++开发一段时间的都会比较清楚动态库和静态库;在这里就不对静态库和动态库做说明了,因为这不是重点(相信做C++开发的你,对这两种库类型也有自己的见解)。重点是,对库接口的封装上面;若我们封装的不好,发现对接口文件进行修改后,发现编译时比较慢;如果库和可执行程序不是一起进行编译的,还要手动进行库和头文件的更换,让人很难受。所以就引出了今天的PIMPL,多余的话不多说了,直接上干货吧!
什么是PIMPL
PIMPL(Pointer to Implementation)是通过使用指针的方式将实现的细节进行隐藏,它的主要作用是将两个文件见的编译依存关系降至最低。
PIMPL的优点
1. 降低模块间的耦合度;
2. 降低编译依赖,提高编译速度;
3. 接口和实现分离,提高接口的稳定性。
参考代码
// pimpl.hpp file
#include <string>
namespace patterns {
class PIMPL {
public:
PIMPL();
~PIMPL();
void set_name(std::string &name);
void print_name();
private:
class Person;
Person *impl_;
}; // class PIMPL
} // namespace patterns
// pimpl.cpp
#include "pimpl.h"
#include <iostream>
namespace patterns{
class PIMPL::Person{
public:
std::string name_;
}; // class Person
PIMPL::PIMPL() {
impl_ = new Person();
}
PIMPL::~PIMPL() {
if (nullptr != impl_){
delete impl_;
}
}
void PIMPL::set_name(std::string &name) {
impl_->name_ = std::move(name);
}
void PIMPL::print_name() {
std::cout << "person name: " << impl_->name_ <<std::endl;
}
} // namespace patterns
// main.cpp
#include <pimpl.cpp>
using namespace patterns;
int main(int argc, char** argv){
std::shared_ptr<PIMPL> pimpl = std::make_shared<PIMPL>();
std::string name = "Aiden Chen";
pimpl->set_name(name);
pimpl->print_name();
return 0;
}
result:
person name: Aiden Chen