pimpl 即 Private Implementation(Pointer to Implementation。
通过一个私有的指针,指向类的内部,以实现类的核心数据的隐藏。
pimpl的优点
- 隐藏类的核心数据成员和私有函数。
- 可加快编译的速度,例如一些复杂的类,引用该类的地方很多,每个引用的地方都要引入头文件
便会增加编译时间,这种方式,将实现放在了cpp文件中,其他地方在引入这个头文件的时候,
依赖的类型变少,编译的速度加快。 - 接口和实现分离,我们导出的头文件,仅仅包含一个pimpl的指针,当我们对pimpl类进行修改时
导出的头文件不需要修改。
一个简单的实例
//pimpl_usage.h
class PImplUsage {
public:
PImplUsage();
~PImplUsage();
void printNumber();
void printString();
//调用了隐藏的类成员函数。
void printStringPublic();
private:
//隐藏了,类的具体的成员变量和私有函数。
class Impl;
Impl * m_pimpl;
};
//pimpl_usage.cpp
#include "pimpl_usage.h"
#include <iostream>
class PImplUsage::Impl {
public:
Impl() {
//初始化工作,例如初始化成员变量等。
m_number = 0;
m_ptr = new char[20]{"hello world!"};
}
~Impl() {
//一些清理工作
delete[] m_ptr;
}
void printStringPrivate();
public:
int m_number;
char *m_ptr;
};
void PImplUsage::Impl::printStringPrivate() {
std::cout << "hello world private!!!" << std::endl;
}
void PImplUsage::printNumber() {
std::cout << m_pimpl->m_number << std::endl;
}
void PImplUsage::printString() {
std::cout << m_pimpl->m_ptr << std::endl;
}
PImplUsage::PImplUsage() {
m_pimpl = new Impl();
}
PImplUsage::~PImplUsage() {
delete m_pimpl;
}
void PImplUsage::printStringPublic() {
m_pimpl->printStringPrivate();
}