pImpl编译器封装技术 C++
一.pimpl总结
pImpl(Pointer to implementation)
实质上就是一个可以替代完成Line功能的指针,当程序员看到Line.h整个函数的时候,在调用Line(int,int,int,int)
,printLine()
这样的成员函数的过程中,实际上都是用_pimpl来替代完成的。
pImpl设计的好处:
1.信息隐蔽性:
只能通过Line函数来了解到Line函数的用法,但是内部实现被隐藏,利用pimpl来替代完成,程序员只看到API,却看不到内部实现;
2.编译依赖减小,降低了耦合性:
当想要对函数实现进行修改的时候,不用修改头文件,直接修改pimpl的实现文件,这样减小了编译依赖,同时在对函数功能进行修改的过程也变简单了。
二.代码
Line.h
:
#ifndef _WD_LINE_H_
#define _WD_LINE_H_
#include <iostream>
using std::cout;
using std::endl;
namespace wd{
class Line{
public:
Line(int,int,int,int);
~Line();
void printLine()const;
private:
class LinepImpl;
LinepImpl *_pimpl;
};
}//end of namespace wd
#endif
Line.cpp
:
#include "Line.h"
using namespace wd;
class Line::LinepImpl{
public:
class Point{
public:
Point(int x, int y)
:_x(x), _y(y)
{
cout << "Point(int,int)" << endl;
}
~Point(){
cout << "~Point()" << endl;
}
void print()const{
cout << "(" << _x << "," << _y << ")";
}
private:
int _x;
int _y;
};
LinepImpl(int x1, int y1, int x2, int y2)
:_p1(new Point(x1,y1))
,_p2(new Point(x2,y2))
{
cout << "LinepImpl(int,int,int,int)" << endl;
}
~LinepImpl(){
delete _p1;
delete _p2;
cout << "~LinepImpl()" << endl;
}
void printLine()const{
_p1->print();
cout << "-->";
_p2->print();
cout << endl;
}
private:
Point *_p1;
Point *_p2;
};
Line::Line(int x1, int y1, int x2, int y2)
:_pimpl(new LinepImpl(x1, y1, x2, y2))
{
cout << "Line(int,int,int,int)" << endl;
}
Line::~Line(){
if(_pimpl){
delete _pimpl;
_pimpl = NULL;
}
}
void Line::printLine()const{
_pimpl->printLine();
}