详解 Qt PIMPL模式
创始人
2024-08-01 22:51:28
0

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

 

  1. //public.h      
  2. Class PrivateClass //前置声明      
  3. Class PublicA:     
  4. {     
  5. Public:     
  6.    PublicA(); //如果私有实现类要调用位于公共类中的方法,则将该公共类指针传给私有类构造函数       
  7.    ~PublicA();     
  8. Private:     
  9.     PrivateClass* iPoint;  //含有私有实现类的一个指针      
  10. Private:     
  11.     Friend class   PrivateClass;  //如果私有实现类要调用公开类的方法,则将之声明为友类。      
  12. }     
  13.  
  14. //public.cpp      
  15. #include "public.h"      
  16. #ifdef Q_OS_SYMBIAN      
  17. #include "PrivateClass_symbian.h"      
  18. #else      
  19. #include "PrivateClass_win32.h"      
  20. #endif      
  21. PublicA::PublicA()     
  22. {      
  23.     #ifdef Q_OS_SYMBIAN                iPoint = PrivateClass::NewL(this);      
  24.     #else          
  25. iPoint= new  PrivateClass( this );     
  26.     #endif      
  27. }    

如上:PIMPL是设计了对外公共类和私有实现类。 亦即:多个平台对外的接口都是***的这个对外公共类,而不同平台都有自己的私有实现类 。 

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

1、在头文件中:

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

(2)含有该私有类的一个指针数据成员。

2、在cpp实现文件中:

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

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

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

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

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

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

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

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

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

私有类就被定义为QMyClassPrivate。

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

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

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

小结:详解 Qt PIMPL模式 的内容介绍完了,希望本文对你有所帮助!

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...