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

来源:互联网 发布:餐饮经营数据分析 编辑:程序博客网 时间:2024/04/30 07:22

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

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


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

      

template <typename T> static inline T *qGetPtrHelper(T *ptr) { return ptr; }template <typename Wrapper> static inline typename Wrapper::pointer qGetPtrHelper(const Wrapper &p) { return p.data(); }#define Q_DECLARE_PRIVATE(Class) \inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr)); } \inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr)); } \friend class Class##Private;#define Q_DECLARE_PRIVATE_D(Dptr, Class) \inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(Dptr); } \inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(Dptr); } \friend class Class##Private;#define Q_DECLARE_PUBLIC(Class)                                    \inline Class* q_func() { return static_cast<Class *>(q_ptr); } \inline const Class* q_func() const { return static_cast<const Class *>(q_ptr); } \friend class Class;#define Q_D(Class) Class##Private * const d = d_func()#define Q_Q(Class) Class * const q = q_func()

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

      person.h

      

#pragma onceclass CPersonPrivate;class CPerson{public:CPerson(void);~CPerson(void);int getAge();std::string getName();private:Q_DECLARE_PRIVATE(CPerson);CPersonPrivate * const d_ptr;};

    person_p.h


#pragma once#include "stdafx.h"#include <string>class CPerson;class CPersonPrivate{Q_DECLARE_PUBLIC(CPerson);public:CPersonPrivate(CPerson * parent): q_ptr(parent){}int age;std::string name;private:CPerson * const q_ptr;};

person.cpp

#include "StdAfx.h"#include "Person.h"#include "personprivate.h"#include "stdlib.h"CPerson::CPerson(void): d_ptr(new CPersonPrivate(this)){Q_D(CPerson);d->age = 30;d->name = "彼得.帕克";}CPerson::~CPerson(void){Q_D(CPerson);delete d;}int CPerson::getAge(){Q_D(CPerson);return d->age;}std::string CPerson::getName(){Q_D(CPerson);return d->name;}