PIMPL模式

进行跨平台的移植工作,这其中有些地方是无法完全移植过来的,所以:需要我们封装一个接口类,在不同平台下让其有不同的实现。要做到这一点:有很多办法, 条件编译啊之类的。但是如果有这种方法,说白了:其还是两份代码,仅仅是放到同一个文件中。参考Qt实现跨平台的办法,正好读了一片这方面的文章,发现 PIMPL模式还是很适用的。

 

 

  1. ----------------------------------------------------------  
  2. //public.h   
  3. Class PrivateClass //前置声明   
  4. Class PublicA:  
  5. {  
  6. Public:  
  7.    PublicA(); //如果私有实现类要调用位于公共类中的方法,则将该公共类指针传给私有类构造函数    
  8.    ~PublicA();  
  9. Private:  
  10.     PrivateClass* iPoint;  //含有私有实现类的一个指针   
  11. Private:  
  12.     Friend class   PrivateClass;  //如果私有实现类要调用公开类的方法,则将之声明为友类。   
  13. }  
  14. ----------------------------------------------------------  
  15. //public.cpp   
  16. #include "public.h"   
  17. #ifdef Q_OS_SYMBIAN   
  18. #include "PrivateClass_symbian.h"   
  19. #else   
  20. #include "PrivateClass_win32.h"   
  21. #endif   
  22. PublicA::PublicA()  
  23. {   
  24.     #ifdef Q_OS_SYMBIAN                iPoint = PrivateClass::NewL(this);   
  25.     #else       
  26. iPoint= new  PrivateClass( this );  
  27.     #endif   
  28. }  
  29. 。。。。。。。  
  30. ---------------------------------------------------------- 
如上:PIMPL是设计了对外公共类和私有实现类。 亦即:多个平台对外的接口都是唯一的这个对外公共类,而不同平台都有自己的私有实现类 。 

      为了做到这一点,需要如下做:

      1:在头文件中:

           ①声明一下私有类(不是include)

           ②含有该私有类的一个指针数据成员。

      2:在cpp实现文件中:

           ①用条件编译的方式决定到底include哪个私有实现类的头文件。

           ②在对外公共类的函数实现中:也用条件编译的方法决定调用哪一个私有实现类的函数。

     为了实现这一点,要求:各个私有实现类的类名必须一样!(文件名可以不一致)

      以上是一个最简单的模型,当然:如果私有实现类中想调用对外公共类的函数,则需要在公共类中做两件事:

      1:在其创建私有类时:通过参数的方式将自己的指针传入到私有类中,从而让私有类含有公共类的指针。

      2:在公共类中将私有类声明为:友元类。  (这样扩大了私有类的访问权限,这个可以依据实际情况来确定需要不需要)

     事实上:这正是Qt用来对底层操作系统进行抽象的解决办法,它使开发者无需关心每一个平台的底层编程方法和各种限制。

      针对qt开发而言:一般这些私有实现类都是针对不同平台的,比如:symbian的一些系同级的函数,还有一些win特有的函数,这些都是无法做到跨平 台的,我们可以用PIMPL模式来进行抽象。此时上边所说的条件编译宏就是:不同平台的宏了。同样:还需要在pro中把针对不同平台的私有实现文件放到平 台关键字中。

 

   通常,如果公共类名为QMyClass ,那么:


私有类就被定义为QMyClassPrivate。


公共类的源文件和头文件共享公共类名:
qmyclass.h , qmyclass.cpp


私有类的头文件和源文件名以
_p  结尾(比如 qmyclass_p.h ),除非该文件是一个平台特定实现。

     平台特定实现的头文件和源文件名中包括平台名 – 如 qmyclass_symbian.cpp  (不必在结尾处添加 _p  ,因为已经暗示)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值