pimpl 惯例是一种新式 C++ 技术,用于隐藏实现、最小化耦合和分离接口。
pimpl 惯例如何改进软件开发生命周期:
- 最大程度地减少编译依赖项。
- 接口和实现分离。
- 可移植性。
关于更多的pimpl手法就不做过多解释了,这里主要是如何实现,Pimpl实现有两种方式
第一种
通过类前置声明
// config.h
class ConfigPrivate;
class Config
{
private:
Config();
public:
~Config();
static Config& Instance()
{
static Config c;
return c;
}
private:
std::unique_ptr<ConfigPrivate> pimpl;
};
注意,这里将Config
声明为友元,目的为了让pimpl指针可以访问到ConfigPrivate
是private私有成员。
//config.cpp
class ConfigPrivate{
public:
private:
friend Config;//声明为友元
};
Config::Config():pimpl(std::make_unique<ConfigPrivate>())
{
}
Qt使用的q,d指针方式也是这样实现的。
第二种
这种方式对于初学者可能不太容易理解。
// my_class.h
class my_class {
my_class();
private:
class impl;
std::unique_ptr<impl> pimpl;
};
// my_class.cpp
class my_class::impl {
friend my_class;
};
my_class::my_class(): pimpl( std::make_unique<impl>() )
{
}