`
Finder
  • 浏览: 27387 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Qt源码剖析:信息隐藏(1)

    博客分类:
  • Qt
阅读更多

如果你阅读了 Qt 的源代码,你会看到一堆奇奇怪怪的宏,例如 Q_D,Q_Q。我们的Qt源码之旅就从理解这些宏说起。

 

下面先看一个C++的例子。

 

class Person
{
public:
	Person(){}
	~Person(){}
	string name();
	void setName(string name);
	int age();
	void setAge(int a);
private:
	string _name;
	int _age;
};

 

 

这是一个很普通的 C++ 类 Person,他有两个属性 name 和 age。我们试想一下,这个类要怎么去使用呢?如果你不想给我源代码,那么至少也要给我一个 dll 或者其他类似的东西,并且你要把这个头文件给我,这样我才能把它 include 到我的代码中使用。我只能使用你暴露给我的 public 的接口。按理说,private 的东西我是不应该知道的,但是现在我知道了!为什么呢?因为我会去读这个头文件,我知道了,原来在 Person 中,age 就是一个 int,name 就是一个 string。这是你不希望看到的,因为既然你把它声明成了 private 的,就是不想让我知道这些东西。那么怎么办呢?嗯,我有一个解决方案。来看下面的代码:

 

person.h

class Person
{
public:
	Person(){}
	~Person(){}
	string name();
	void setName(string name);
	int age();
	void setAge(int a);
private:
	PersonPrivateData *data;
};

 

persondata.cpp

class PersonPrivateData
{
public:
	string name;
	int age;
};

 

 

怎么样?在 person.h 中看不到我是怎么存储的数据了吧?嗯嗯,也许你很聪明:我还可以在 persondata.cpp 中找到那些声明啊!当然,这是C++语法规定的,我们已经左右不了——但是,我为什么非要把 cpp 文件一并给你呢?因为你使用我的类库的话完全不需要使用 cpp 文件啊。

 

这就是一种信息隐藏的方法。看上去很麻烦,原本很简单的对 name 和 age 的访问都不得不通过一个指针去访问它,何必呢?其实这样做是有好处的:

 

  • 减少头文件的依赖。像这样我们把数据成员都写在 cpp 文件中,当我们需要修改数据成员的时候就只需要修改 cpp 文件。虽然都是修改,但这和修改 .h 文件是不一样的!原因在于,如果 .h 文件发生改变,编译器会重新编译所有 include 了这个 .h 文件的文件。如果你这个类相当底层,那就会花费很长时间。
  • 增加类的信息封装。这意味着你根本看不到具体数据类型,必须使用 getter 和 setter 去访问。我们知道 C++ 有一个 typedef 语句,我定义一个数据类型 ABC,如果你看不到具体文件,你会知道这个 ABC 是 string 还是  int 么?

这就是 C++ 的一种设计方法,被称为 Private Class,大约就是私有类吧!更确切地说应该是私有数据类。据说,这也是 Qt 2.x  的实现方式。但是如果你去看你的 Qt SDK 代码,你是看不到这样的语句的,取而代之的则是一些我们开头所说的 Q_D 这些宏。或许你已经隐隐约约地猜到了,这些宏就是实现这个的:Private Data。

1
1
分享到:
评论

相关推荐

    qt源码 最好用的源码

    这个“qt源码 最好用的源码”压缩包可能包含了完整的QT库源代码,这对于开发者深入理解其工作原理、进行二次开发或者优化性能有着极高的价值。 QT库的核心特性包括: 1. **跨平台性**:QT支持多种操作系统,如...

    解决Qt源码编译报The OpenGL functionality tests failed

    Qt源码编译./configure -prefix $PWD/qtbase -opensource 报错 ERROR: The OpenGL functionality tests failed ubuntu 14.04 LTS qt-everywhere-opensource-src-5.9.9

    在linux下编译Qt源码,测试环境乌班图

    另外,提供的文件"编译Qt源码.pdf"可能是编译过程的详细指南或注意事项,建议阅读以获取更具体的信息。而".emmx"文件格式不常见,可能是一种特定的思维导图文件,与编译过程关系不大,如果需要打开,确保证明已安装...

    VS2008编译QT源码

    1. VS2008编译QT源码的必要条件是安装了VS2008和QT的源代码。 2. 在编译QT源码之前,需要设置环境变量,包括 Path 变量和 QTDIR 变量。Path 变量用于指定QT的bin目录,QTDIR 变量用于指定QT的安装目录。 3. 在 ...

    QT6源码编译所需要的工具

    QT6源码编译是一个复杂的过程,涉及到许多步骤和技术细节。在Visual Studio 2019环境下编译QT6.1.3版本,你需要准备一些必要的工具和了解关键的编译流程。以下是一份详尽的指南: 1. **安装必备软件**: - **...

    Qt编程练习:Qt实现串口调试助手

    Qt编程练习:Qt实现串口调试助手,界面参考野火串口调试助手C#版,所以功能基本实现。博文地址:https://blog.csdn.net/qq_44793587/article/details/124473293

    Qt实现窗体在显示屏旁边自动隐藏/显示

    "Qt实现窗体在显示屏旁边自动隐藏/显示"这个话题涉及到的是如何让一个Qt窗口根据用户的操作或者系统状态,智能地出现在屏幕边缘或者隐藏起来,提供一种类似QQ等即时通讯软件的用户体验。这种功能可以增加应用的便捷...

    PCL+QT源码:增加树形控件

    首先,让我们了解“PCL+QT源码:增加树形控件”这一主题的核心概念。这里的“树形控件”通常指的是QT中的QTreeWidget或QTreeView,它们允许用户以层次结构的方式显示数据。在PCL的上下文中,这可以用于展示和管理...

    交叉编译QT4.8.7源码生成qmake工具.pdf

    1. **构建QT源码**:QT源码的一系列编译命令已被封装成`build_arm.sh`脚本。此脚本指定交叉编译器的路径和版本,并通过`./configure`指定QT源码编译时的配置选项。这些配置包括编译为`release`版本、动态链接库形式...

    2048游戏Qt源码

    【标题】"2048游戏Qt源码"是一个基于Qt框架实现的2048游戏的编程项目,它展示了如何使用Qt库来构建一个功能完整的游戏应用。Qt是一个跨平台的应用程序开发框架,广泛应用于桌面和移动平台,提供丰富的图形用户界面...

    正点QT视频配套源码:

    1. **QT基本概念**:包括QT的安装、配置环境,以及如何创建第一个QT项目。 2. **QT Creator**:这是QT的主要集成开发环境(IDE),学习如何使用其界面、项目管理、调试工具等。 3. **QT Widgets**:QT提供了一系列...

    Qt基于数据库的学生管理系统源码.zip

    Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码...

    Qt-5.12.12源码

    1. **Core模块**:它是Qt的基础,提供数据类型、内存管理、线程支持、事件处理和日志记录等功能。例如,QObject类是所有Qt对象的基类,提供了信号与槽机制,这是Qt异步通信的关键。 2. **Gui模块**:提供图形用户...

    log4qt源码

    《深入解析log4qt日志库源码》 在软件开发中,日志记录是必不可少的环节,它能够帮助开发者追踪程序运行状态,定位错误,优化性能。Log4Qt是Qt框架下的一个强大的日志系统,它借鉴了Java界的log4j设计模式,提供了...

    基于qt的汽车销售管理系统(源码+数据库脚本).rar

    1. **Qt框架**:Qt库提供了丰富的控件和工具,用于构建用户界面,如QLabel、QPushButton、QLineEdit、QTableView等。它还支持事件驱动编程模型,使得处理用户交互变得简单。此外,Qt的信号与槽机制是其核心特性之一...

    Qt源码窥探(1)---创建窗口过程图解

    Qt源码窥探(1)---创建窗口过程图解。。

    Qt+Cutelyst学习笔记(二十八)win10+Qt5.15.2+qmake接收表单提交的文件 示例源码

    Qt+Cutelyst学习笔记(二十八)win10+Qt5.15.2+qmake接收表单提交的文件 示例源码 https://blog.csdn.net/aggs1990/article/details/124128783 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下

    QT-侧靠动画窗口-隐藏和显示窗体

    1. **QStackedWidget**:这是QT中一个非常有用的容器控件,它可以堆叠多个窗口小部件,并根据需要显示其中的一个。在这种情况下,我们可以用它来管理侧靠窗体和其他主要内容窗体的切换。 2. **QPropertyAnimation**...

    Qt示例程序源码.rar_QT5_Qt 程序 源码_qt源码_源码 QT

    在本资源中,我们关注的是Qt5.8的示例程序源码,这对于学习和理解Qt框架的功能和用法非常有帮助。Qt是一个跨平台的应用程序开发框架,它使用C++语言,支持Windows、Linux、macOS等多种操作系统。Qt5是Qt的一个主要...

Global site tag (gtag.js) - Google Analytics