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;}
- C++类的私有成员变量和函数的隐藏
- QT类的私有成员变量和函数的隐藏
- 类的私有成员变量和私有成员函数
- C/C++—— 除了用类成员函数访问类私有成员变量外,还可以通过类对象地址来直接访问和修改类的私有成员变量
- 黑马程序员---定义一个包含私有成员变量和函数的类
- 同一个类的不同对象,对象的成员函数可以互相访问各自对象的私有变量和私有成员函数
- 导出DLL 隐藏私有成员变量和成员函数 工厂方法
- 不使用成员函数或者友元函数访问类的私有成员变量
- 【牛客 题库】 重载函数||类中声明的变量||访问类私有成员变量||int 和 unsigned int||*p
- perl 在类中建私有成员变量和私有成员函数
- iOS访问类的私有成员变量及私有方法
- iOS访问类的私有成员变量及私有方法
- 私有成员变量的理解
- 私有的静态成员变量
- 成员变量的隐藏
- 成员变量的隐藏
- Python类中的私有成员(私有函数,私有变量)
- Python类中的私有成员(私有函数,私有变量)
- https://www.cocoacontrols.com/
- OpenCV/FreeImage/CImg/CxImage
- ListControl双击实现可编辑
- C++图书推荐
- HashMap工作原理
- C++类的私有成员变量和函数的隐藏
- ubuntu 下安装和卸载软件
- B/S架构的优点和缺点
- 如何在windows2008 iis7取消目录执行权限技巧
- 如何用scoket发送结构体
- 半监督学习【领域简介】
- 虚拟机linux下配置android环境
- nm, objdump
- 读取文本中的数字(其中包含中英文字符)