C++类的私有成员变量和函数的隐藏
2013-11-22 11:18
465 查看
我们在写C++的代码的时候,尤其是给三方提供库的情况下,所提供的类头文件中包含了很多的私有的变量和函数,对于调用和开发的人来说都是很繁琐的一件事情,最近在写QT代码的时候发现对其私有的东西隐藏很好,仔细研究,其实就是对这个类提供一个私有的类,然后通过宏对这个类进行使用,非常方便。
通过研究发现移植到其他的C++代码中也是非常好的一件事情,现将这个东东班门弄斧的整理一下,以供大家参考:
首先定义宏,如VC编写的情况下可以放到stdafx.h中
下面我提供一个简单的使用例子,如定义类 Person,需要如下3个文件:person.h person_p.h person.cpp
person.h
person_p.h
person.cpp
通过研究发现移植到其他的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; }
相关文章推荐
- Accelerated C++ Exercise 11-0(自定义VECTOR模板)
- C语言序列点问题总结(大多数高等教育C语言教学课程的漏洞)
- 使你的C/C++代码支持Unicode
- C++中构造函数的那点事
- Google C++测试框架系列入门篇:第二章 开始一个新项目
- C++类构造函数初始化列表(详解)
- C++语言中类的成员变量初始化(转…
- C++电话面试
- c/c++通过socket发送结构体
- C++--深入分析MFC文档视图结构(项…
- C++指针和引用的区别
- C语言中的typeof关键字
- C++中那些不常用的关键字
- C++的头文件和实现文件分别写什么…
- C++的头文件和实现文件分别写什么&amp;…
- C++文件读(逐行读、逐单词读)
- C++单件模式
- C++实习生笔试及HR面试总结
- C++二面(转)
- 看源码学C++运算符重载(转)