Pimpl:Pointer to implementation是一种编程技巧。这种方法主要有两个优势:增加编译速度,隐藏接口细节。
例如有一个接口是这样的:
class B
{
public:
B();
~B();
void f();
private:
int a;
std::string b;
std::vector<int>vec;
};
需要提供给用户,但是用户可能根据我定义的变量猜到我的具体实现,或者我需要新增成员变量时,需要重新提供头文件。
这时,Pimpl就派上用场了:把成员变量封装成一个指针变量
//.h文件
class B
{
public:
B();
~B();
void f();
private:
class PrivateMembers;
std::unique_ptr<PrivateMembers> pm_ptr_;
};
实现文件:
//cpp文件
#include "pch.h"
#include "B.h"
class B::PrivateMembers
{
public:
PrivateMembers() = default;
~PrivateMembers() = default;
int a;
std::string b;
std::vector<int>vec;
};
//
B::B():pm_ptr_(std::make_unique<PrivateMembers>())
{
}
//析构函数必须在cpp文件中,具体原因参考modern effective c++
B::~B()
{
}
void B::f()
{
std::cout << pm_ptr_->a << std::endl;
}
参考:
1
modern effective c++