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

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

2013年11月22日 11:18:24 咖啡老猫 阅读数:6684

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

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

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

      

 
  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

      

 
  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

 
  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

 
  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. }

猜你喜欢

转载自blog.csdn.net/lusic01/article/details/88239381