不管是模块化设计,还是面向对象设计。还是分层设计,实现子系统内部信息的对外隐藏都是最关键的内在要求。以本人浅显的经验,把信息隐藏依照程度的不同分成(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++程序开发中实现信息隐藏的三种类型的更多相关文章

  1. IOS程序开发中-跳转到 发送短信界面 实现发短信

    前言:我发现我标题取的不好,谁帮我取个承接上下文的标题?评论一下,我改 项目需求:在程序开发中,我们需要在某个程序里面发送一些短信验证(不是接收短信验证,关于短信验证,传送门:http://www.c ...

  2. 总结微信小程序开发中遇到的坑

    总结微信小程序开发中遇到的坑,一些坑你得一个一个的跳啊,/(ㄒoㄒ)/~~ 1,页面跳转和参数传递实例 首先说一下我遇到的需求有一个我的消息页面,里面的数据都是后端返回的,返回的数据大致如下,有一个是 ...

  3. 在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...

  4. 微信小程序开发教程 #043 - 在小程序开发中使用 npm

    本文介绍了如何在微信小程序开发中使用 npm 中包的功能,大大提高微信小程序的开发效率,同时也是微信小程序系列教程的视频版更新. 微信小程序在发布之初没有对 npm 的支持功能,这也是目前很多前端开发 ...

  5. AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  6. 解决微信小程序开发中wxss中不能用本地图片

    微信小程序开发中wxss中不能用本地图片,我们可以用将我们的图片传到服务器上,然后直接引用在线地址.但是当我们没有服务器时,我们可以用"图床",这个具体可以百度.这里我们用第二种方 ...

  7. 程序开发中的术语,如IDE,OOP等等

    我们在开发程序过程中,会用到一些与编译有关的术语,比如:[编辑器.编译器.调试器.连接器,链接器.解释器,集成开发环境(Integrated Development Environment,IDE). ...

  8. 怎样在Android开发中FPS游戏实现的两种方式比较

    怎样在Android开发中FPS游戏实现的两种方式比较 如何用Android平台开发FPS游戏,其实现过程有哪些方法,这些方法又有哪些不同的地方呢?首先让我们先了解下什么是FPS 英文名:FPS (F ...

  9. Android平台中实现对XML的三种解析方式

    本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...

随机推荐

  1. JVM监测分析JConsole

    一.基本操作   启动界面 1.JConsole是什么 从Java 5开始引入了JConsole.JConsole是一个内置Java性能分析器,可以从命令行或在GUI shell中运行.您可以轻松地使 ...

  2. 删除cnpm

    cnpm是npm的中国镜像:这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步. 安装:npm install -g cnp ...

  3. Arduino+GPRS 的环境监控方案

    设备前台界面:http://www.lewei50.com/home/gatewaystatus/361#576 本实采用的硬件,除了一个串口模块以外(约200元),其他均可以从taobo上面找到标准 ...

  4. Concise: Compressed ’n’ Composable Integer Set

    Word Aligned Hybrid (WAH) bitmap compression 下面是:Concise: Compressed ’n’ Composable Integer Set Figu ...

  5. python连接mysql并插入数据(自用)

    #coding=utf-8 import MySQLdb db = MySQLdb.connect("IP","用户名","密码",&quo ...

  6. [Flutter] Creating, Importing & Using Dynamic Widgets from Other Files in a Flutter Application

    In this lesson we’ll learn how to import widgets we’ve created in other files & use them in our ...

  7. Python学习笔记(七)函数的使用

    python中的函数使用较简单,这里列出值得注意的几点:   内嵌函数   例如: # coding: utf-8 def foo(): def bar(): print 'bar() called. ...

  8. Sql Server分页分段查询百万级数据四种项目实例

    实际项目中需要实现自定义分页,最关键第一步就是写分页SQL语句,要求语句效率要高. 那么本文的一个查询示例是查询第100000-100050条记录,即每页50条的结果集.查询的表名为infoTab,且 ...

  9. Leetcode--easy系列3

    #26 Remove Duplicates from Sorted Array Given a sorted array, remove the duplicates in place such th ...

  10. jQuery校验 表单验证

    官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...