C++类的私有成员变量和函数的隐藏
2013年11月22日 11:18:24 咖啡老猫 阅读数:6684
我们在写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 once
-
class 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;
-
}