pImp机制--隐藏实现减小头文件依赖

原创 2015年11月19日 10:08:34
pImp是private implemention的缩写。在C++中,当需要引用其他头文件中定义的类、函数、变量时,需要在应用前将需要的头文件包含到当前的文件中。如,
   
//头文件"A.h"
    #pragma once
    class A
    {
        ...
    }

    //头文件"B.h"
    #pragma once
    #include "A.h"
    class B
    {
        ...
        A a;
    }

在编译头文件"B.h"时,编译器首先需要变以头文件"A.h",因为类B依赖类A,只有知道类A的构成之后,编译器才能确定类B对象的结构,才能够为B对象分配内存。假如类A的头文件发生了变化,那在编译时,类B也必须进行重新编译。而进一步假设类B也 以同样的方式被类C引用,类C又被类D引用...,那头文件"A.h"的改变会导致所有类的重新编译,这样会大大增加增加编译时间。对于一个大型项目而言,有时是不可接受的。因此在实际编程中,需要减小头文件之间的依赖关系,这也就是这里的pImp机制。
此处,我们将"B.h"修改为如下:
   
    //头文件"B.h"
    #pragma once
    class A;
    class B
    {
        ...
        A * a;    //此处只作示意用,实际编程中应该尽可能的使用智能指针替代
    }

这样一来,编译器就无需知道类A的具体结构即可确定类B对象的内存结构了,因为此处成员变量"a"只占是一个指针,在32位系统上只占4个字节,它的大小与类A没有关系。所以当头文件"A.h"改变时,便只需要对"A.h"进行重新编译即可,而"B.h"无需重新编译。
除了这种头文件之间的pImp,在单个类中也可以使用这种思想,例如,假设我们有如下类:
    //头文件"A.h"
    #pragma once
    class A
    {
        ...
        private:
            class Inner    
            {
                    ...
            };
            Inner innerMember;
    };

以上类A中,有一个内部类Inner,假如过了一段时间,由于新的需求,需要对Inner类进行修改,这便会导致所有依赖头文件"A.h"的头文件全部需要重新编译。为了避免这种依赖,这里同样可以使用pImp机制,在头文件中声明类Inner,在cpp文件中对Inner类进行定义,构造函数中初始化成员指针innerMember:
 
    //头文件"A.h"
    #pragma once
    class A
    {
       class Inner;    
        ...
        private:
            Inner * innerMember; //仅仅示意用,实际情况应该使用智能指针
    };

    //实现文件"A.cpp"
    class A::Inner
    {
        ...
    }
    
    A::A()
    {
        innerMember = new Inner;
    }

当然,采用pImp机制会带来额外的开销,因为这种方式的成员需要利用new来动态分配内存。另外,也会容易造成内存泄露,而为了避免内存泄露,应该采用RAII机制,利用智能指针替代原始指针。    

版权声明:本文为博主原创文章,如需转载,请注明出处。

C++“隐藏实现,开放接口”的实现方案

为什么要有接口?接口就是一个程序与其它程序交流的窗口。就比如有一个电视机,我并不需要知道它是怎样工作的,我只要知道按电源键就可以开启电视,按节目加(+)减(-)可以切换电视频道就可以了。Java程序员...

pImp机制--隐藏实现减小头文件依赖

pImp是private implemention的缩写。在C++中,当需要引用其他头文件中定义的类、函数、变量时,需要在应用前将需要的头文件包含到当前的文件中。如,     [cpp...

头文件和源文件在不同目录情况下 Makefile自动推导依赖关系的实现

参考 跟我一起写Makefile http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=408225&extra=&authorid=106107...
  • shun01
  • shun01
  • 2014年04月04日 16:40
  • 2054

VC头文件依赖关系分析工具

  • 2009年01月08日 17:13
  • 1.16MB
  • 下载

谈谈vc如何写dll(封装性,隐藏头文件,私有成员)

最近项目进行到一定阶段,老板要求把已完成部分分离开并把各模块封装成dll。用vs开发dll当然很简单,是用vs的向导可以很快写一个dll.但是我遇到了一些问题:刚开始只需要把各个模块的头文件和cpp加...

ipxe编译依赖lzma头文件

  • 2015年03月19日 23:02
  • 99KB
  • 下载

Makefile基础---自动处理头文件的依赖关系

Makefile基础---自动处理头文件的依赖关系  现在我们的Makefile写成这样: all: main main: main.o stack.o maze.o gcc $^ -o ...

遗传算法头文件的cpp实现

  • 2015年05月15日 17:56
  • 6KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:pImp机制--隐藏实现减小头文件依赖
举报原因:
原因补充:

(最多只允许输入30个字)