设计模式之Pimpl
当两个公司进行合作的时候,A公司不想让B公司看到自己的核心代码是如何实现的,就可以用到此方法。
Pimpl可以对类内部实现数据进行隐藏。有如下优点:
-
提高编译速度;
-
实现信息隐藏;
-
减小编译依赖,可以用最小的代价平滑的升级库文件;
-
接口与实现进行解耦;
-
移动语义友好。
代码示例:
/// @file pimpl.h
#include <iostream>
using std::cout;
using std::endl;
class Point
{
public:
Point(int, int);
~Point();
void printPoint() const;
private:
class Pointpimpl;
Pointpimpl* _pimpl;
};
/// @file pimpl.cc
#include "pimpl.h"
#include <iostream>
using std::cout;
using std::endl;
class Point::Pointpimpl
{
public:
Pointpimpl(int x, int y);
~Pointpimpl();
void printPoint();
private:
int _x;
int _y;
};
Point::Pointpimpl::Pointpimpl(int x, int y)
:_x(x)
,_y(y)
{
cout << "Num()" << endl;
}
Point::Pointpimpl::~Pointpimpl()
{
cout << "~Num()" << endl;
}
void Point::Pointpimpl::printPoint()
{
cout << "(" << _x
<< "," << _y
<< ")" << endl;
}
Point::Point(int x, int y)
:_pimpl(new Pointpimpl(x, y))
{
cout << "Point()" << endl;
}
Point::~Point()
{
if(_pimpl)
delete _pimpl;
cout << "~Point()" << endl;
}
void Point::printPoint() const
{
_pimpl->printPoint();
}
/// @file pimpltest.cc
#include <iostream>
#include "pimpl.h"
using std::cout;
using std::endl;
int main(void)
{
Point p1(6, 8);
p1.printPoint();
return 0;
}
将pimpl.cc封装成动态库可以很方便的平滑升级库文件