QT类的私有成员变量和函数的隐藏

转载自 http://blog.csdn.net/wsl888444/article/details/16880091

http://blog.csdn.net/liyong2688/article/details/7176722

我们在写C++的代码的时候,尤其是给三方提供库的情况下,所提供的类头文件中包含了很多的私有的变量和函数,对于调用和开发的人来说都是很繁琐的一件事情,最近在写QT代码的时候发现对其私有的东西隐藏很好,仔细研究,其实就是对这个类提供一个私有的类,然后通过宏对这个类进行使用,非常方便。

       通过研究发现移植到其他的C++代码中也是非常好的一件事情,现将这个东东班门弄斧的整理一下,以供大家参考:


      首先定义宏,如VC编写的情况下可以放到stdafx.h中

      

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. template <typename T> static inline T *qGetPtrHelper(T *ptr) { return ptr; }  
  2. template <typename Wrapper> static inline typename Wrapper::pointer qGetPtrHelper(const Wrapper &p) { return p.data(); }  
  3. #define Q_DECLARE_PRIVATE(Class) \  
  4.     inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } \  
  5.     inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } \  
  6.     friend class Class##Private;  
  7.   
  8. #define Q_DECLARE_PRIVATE_D(Dptr, Class) \  
  9.     inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(Dptr); } \  
  10.     inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(Dptr); } \  
  11.     friend class Class##Private;  
  12.   
  13. #define Q_DECLARE_PUBLIC(Class)                                    \  
  14.     inline Class* q_func() { return static_cast<Class *>(q_ptr); } \  
  15.     inline const Class* q_func() const { return static_cast<const Class *>(q_ptr); } \  
  16.     friend class Class;  
  17.   
  18. #define Q_D(Class) Class##Private * const d = d_func()  
  19. #define Q_Q(Class) Class * const q = q_func()  

      下面我提供一个简单的使用例子,如定义类 Person,需要如下3个文件:person.h   person_p.h   person.cpp

      person.h

      

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #pragma once  
  2. class CPersonPrivate;  
  3.   
  4. class CPerson  
  5. {  
  6. public:  
  7.     CPerson(void);  
  8.     ~CPerson(void);  
  9.     int getAge();  
  10.     std::string getName();  
  11. private:  
  12.     Q_DECLARE_PRIVATE(CPerson);  
  13.     CPersonPrivate * const d_ptr;  
  14.   
  15. };  

    person_p.h

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #pragma once  
  2. #include "stdafx.h"  
  3. #include <string>  
  4. class CPerson;  
  5.   
  6. class CPersonPrivate  
  7. {  
  8.     Q_DECLARE_PUBLIC(CPerson);  
  9.   
  10. public:  
  11.     CPersonPrivate(CPerson * parent)  
  12.         : q_ptr(parent)  
  13.     {  
  14.   
  15.     }  
  16.     int age;  
  17.     std::string name;  
  18. private:  
  19.     CPerson * const q_ptr;  
  20. };  

person.cpp

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include "StdAfx.h"  
  2. #include "Person.h"  
  3. #include "personprivate.h"  
  4. #include "stdlib.h"  
  5. CPerson::CPerson(void)  
  6.     : d_ptr(new CPersonPrivate(this))  
  7. {  
  8.     Q_D(CPerson);  
  9.     d->age = 30;  
  10.     d->name = "彼得.帕克";  
  11. }  
  12.   
  13.   
  14. CPerson::~CPerson(void)  
  15. {  
  16.     Q_D(CPerson);  
  17.     delete d;  
  18. }  
  19.   
  20. int CPerson::getAge()  
  21. {  
  22.     Q_D(CPerson);  
  23.     return d->age;  
  24. }  
  25. std::string CPerson::getName()  
  26. {  
  27.     Q_D(CPerson);  
  28.     return d->name;  
  29. }  
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值