C/C++程序开发中实现信息隐藏的三种类型
不管是模块化设计,还是面向对象设计。还是分层设计,实现子系统内部信息的对外隐藏都是最关键的内在要求。以本人浅显的经验,把信息隐藏依照程度的不同分成(1)不可见不可用(2)可见不可用(3)可见可用。
1 不可见不可用
就是说模块内部的变量、结构体、类定义对外部而已全然隐藏。外部对此一无所知。经常使用的实现方法就是利用不透明指针,请參见我的博文C语言开发函数库时利用不透明指针对外隐藏结构体细节。
这样的方法相同适用于C++语言。一种可能的实现方式为面向接口编程。
头文件 IMyClass.h
class IMyClass
{
public:
virtual ~IMyClass();
public:
virtual void public_function1();
virtual void public_function2();
};
IMyClass* CreateMyClassObject();
实现文件 MyClass.cpp
#include "IMyClass.h"
class MyClass : IMyClass.h
{
private:
int x;
int y;
int z;
public:
virtual void public_function1();
virtual void public_function2();
};
IMyClass* CreateMyClassObject()
{
return new MyClass();
}
这样的实现方法在源代码层次和库层次上都能适用。
理论上说。全然实现不可见是最完美的设计。然而这对于程序设计要求非常高。并且会带来很多其它的代码量和设计逻辑层次以及一些限制(如无法实现对已有类型的继承)。
所以,非常多C++库的设计都採用了以下这样的可见不可用的方式,如MFC。
2 可见不可用
这样的方法指的是专门针对C++而言的,指的是C++类中的非公开类型成员。比如在头文件 myclass.h中:
class MyClass
{
private:
int x;
int y;
int z;
protected:
float f;
public:
int M;
void member_method1();
};
对于调用方来说。包括次头文件后,尽管可以看到x,y,z等成员变量,可是却无法使用它们。仅仅要client须要使用 new 来生成实例或者继承类。就必须知道类的完整定义。
对C语言而言,不存在这样的情况,由于结构体里的不论什么变量都是公开的。
3 可见可用
也就是毫无隐藏而言了,程序设计中绝对要避免。
C/C++程序开发中实现信息隐藏的三种类型的更多相关文章
- IOS程序开发中-跳转到 发送短信界面 实现发短信
前言:我发现我标题取的不好,谁帮我取个承接上下文的标题?评论一下,我改 项目需求:在程序开发中,我们需要在某个程序里面发送一些短信验证(不是接收短信验证,关于短信验证,传送门:http://www.c ...
- 总结微信小程序开发中遇到的坑
总结微信小程序开发中遇到的坑,一些坑你得一个一个的跳啊,/(ㄒoㄒ)/~~ 1,页面跳转和参数传递实例 首先说一下我遇到的需求有一个我的消息页面,里面的数据都是后端返回的,返回的数据大致如下,有一个是 ...
- 在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)
本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...
- 微信小程序开发教程 #043 - 在小程序开发中使用 npm
本文介绍了如何在微信小程序开发中使用 npm 中包的功能,大大提高微信小程序的开发效率,同时也是微信小程序系列教程的视频版更新. 微信小程序在发布之初没有对 npm 的支持功能,这也是目前很多前端开发 ...
- AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...
- 解决微信小程序开发中wxss中不能用本地图片
微信小程序开发中wxss中不能用本地图片,我们可以用将我们的图片传到服务器上,然后直接引用在线地址.但是当我们没有服务器时,我们可以用"图床",这个具体可以百度.这里我们用第二种方 ...
- 程序开发中的术语,如IDE,OOP等等
我们在开发程序过程中,会用到一些与编译有关的术语,比如:[编辑器.编译器.调试器.连接器,链接器.解释器,集成开发环境(Integrated Development Environment,IDE). ...
- 怎样在Android开发中FPS游戏实现的两种方式比较
怎样在Android开发中FPS游戏实现的两种方式比较 如何用Android平台开发FPS游戏,其实现过程有哪些方法,这些方法又有哪些不同的地方呢?首先让我们先了解下什么是FPS 英文名:FPS (F ...
- Android平台中实现对XML的三种解析方式
本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...
随机推荐
- Android 拍照、从相册获取及裁剪的相关实现
首先这些功能都是通过Intent去启动系统的服务去实现的,所以自然就有相应的Action.相关Actiong如下: 拍照——MediaStore.ACTION_IMAGE_CAPTURE (" ...
- python3用pyqt5开发简易浏览器
http://python.jobbole.com/82715/ 在这篇教程中,我们会用 Python 的 PyQt 框架编写一个简单的 web 浏览器.关于 PyQt ,你可能已经有所耳闻了,它是 ...
- OpenWrt 路由器过滤广告的N种方法
路由器已经成为每个家庭不可缺少的角色,手机.电脑.电视,凡是需要互联网的设备都要用到它.那么路由器除了给我们的网络设备分发网络外,还有其他用途吗? 现在很多人家里都用着智能路由器,智能路由器究竟怎么智 ...
- Myeclipse中文件已经上传到server文件夹下,文件也没有被占用,可是页面中无法读取和使用问题的解决方法
这个问题是因为Myeclipse中文件不同步引起的.在Myeclipse中,project文件是由Myeclipse自己主动扫描加入的,假设在外部改动了project文件夹中的文件但又关闭了自己主动刷 ...
- go get 下载的包放在哪里呢?
有些问题,我以前都是似懂非懂,没有去弄个究竟!!!!! 这个习惯非常不好,搞得有些东西看似懂了,又不能百分之百说自己懂了,可能下次就弄不出来了,这样是不可取的. 不能有这种做事的风格. ------- ...
- 开源 免费 java CMS - FreeCMS1.9 移动APP管理 栏目配置
项目地址:http://www.freeteam.cn/ 栏目配置 管理员能够在这里设设置栏目是否是否同意移动app訪问.栏目页的布局等属性. 从左側管理菜单点击栏目配置进入. 选择须要管理的栏目后点 ...
- C#和Java中字符串的异同
字符串 在底层上跟C#类似,每个字符串的实例都不可修改.当修改字符串变量时,是将变量指向新的字符串实例,而不是修改原本的实例.Java中也有字符串池机制. 注意:使用 == 运算符比较字符串时,跟C# ...
- Excel 将换行符替换为空
Step1:按快捷键Ctrl+H,打开"查找和替换"对话框: Step2:选择"查找内容"后的文本框,按住Alt键,在数字键盘中输入&quo ...
- 预装WIN8改装WIN7之BIOS设置
不少预装WIN8/10的朋友觉得WIN8/10不好用,想改装WIN7,可改装之后常常出现各种问题,甚至不能启动,往往是BIOS设置不当. 本文以联想小新V2000 预装WIN8.1中文版为例,说说WI ...
- 移动端H5实现图片上传
移动端H5实现图片上传 https://segmentfault.com/a/1190000010034177