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

我们在写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;
}


  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值