pImpl编译器封装技术 C++

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();
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值