接上一篇:C面向对象编程--抽象数据类型(1) ,本篇主要实现Set
实现--Set
main.c 可以成功编译,但是在编译和执行程序之前,我们必须实现抽象数据类型和内存管理,如果一个对象不储存任何信息,并且每一个对象都至少属于一个set,那么我们可以用一个唯一的较小的正整数值来表示对象和每一个set,而这些正整数值可以使用一个数组heap[ ]中的索引来表示。
如果一个对象是set的成员,对应的数组元素包含代表set的整数值。
Sets和对象具有相同的展示,new( )不会在意type的类型描述,它将返回heap[ ]中值为0的元素,代码如下:
#if ! defined MANY || MANY < 1 #define MANY 10 #endif static int heap [MANY]; void * new (const void * type, ...) { int * p; /* & heap[1..] */ for (p = heap + 1; p < heap + MANY; ++ p) if (! * p) break; assert(p < heap + MANY); * p = MANY; return p; }
使用0来标记heap[ ]中的有效元素,结果,我们不能返回指向heap[0]的指针----假如是set,其成员可以获得0索引。new()可能越界,可以使用assert()来避免。elete()必须小心null指针,一个heap[]元素通过被设置为0从而被回收:
void delete (void * _item) { int * item = _item; if (item) { assert(item > heap && item < heap + MANY); * item = 0; } }
注:我们必须使用统一的方式来处理通用指针,于是我们使用在变量名前加下划线前缀的方法,只是用来初始化我们期待的类型并且名字接近的局部变量。
一个set有所包含的的对象表示:每一个元素指向set,假如一个元素包含MANY,就可以添加到set,否则,说明set中已经包含。
void * add (void * _set, const void * _element) { int * set = _set; const int * element = _element; assert(set > heap && set < heap + MANY); assert(* set == MANY); assert(element > heap && element < heap + MANY); if (* element == MANY) * (int *) element = set - heap; else assert(* element == set - heap); return (void *) element; }
其他的函数就简单了,find( ) 仅仅用来判断set中是否包含有下划线前缀的变量名元素:
void * find (const void * _set, const void * _element) { const int * set = _set; const int * element = _element; assert(set > heap && set < heap + MANY); assert(* set == MANY); assert(element > heap && element < heap + MANY); assert(* element); return * element == set - heap ? (void *) element : 0; }
contains( )将find( ) 得到的结果转换为一个真值:
int contains (const void * _set, const void * _element) { return find(_set, _element) != 0; }
drop( ) 依赖find( )函数来检查要删除的元素是否在set中,若是,则通过将相应的对象元素的值标记为MANY:
void * drop (void * _set, const void * _element) { int * element = find(_set, _element); if (element) * element = MANY; return element; }
接着提供了一个判断两个对象是否相等的函数differ( ):
int differ (const void * a, const void * b) { return a != b; }
完整的Set.c源代码如下:
#include <assert.h> #include <stdio.h> #include "new.h" #include "Set.h" #include "Object.h" const void * Set; const void * Object; #if ! defined MANY || MANY < 1 #define MANY 10 #endif static int heap [MANY]; void * new (const void * type, ...) { int * p; /* & heap[1..] */ for (p = heap + 1; p < heap + MANY; ++ p) if (! * p) break; assert(p < heap + MANY); * p = MANY; return p; } void delete (void * _item) { int * item = _item; if (item) { assert(item > heap && item < heap + MANY); * item = 0; } } void * add (void * _set, const void * _element) { int * set = _set; const int * element = _element; assert(set > heap && set < heap + MANY); assert(* set == MANY); assert(element > heap && element < heap + MANY); if (* element == MANY) * (int *) element = set - heap; else assert(* element == set - heap); return (void *) element; } void * find (const void * _set, const void * _element) { const int * set = _set; const int * element = _element; assert(set > heap && set < heap + MANY); assert(* set == MANY); assert(element > heap && element < heap + MANY); assert(* element); return * element == set - heap ? (void *) element : 0; } int contains (const void * _set, const void * _element) { return find(_set, _element) != 0; } void * drop (void * _set, const void * _element) { int * element = find(_set, _element); if (element) * element = MANY; return element; } int differ (const void * a, const void * b) { return a != b; }
相关推荐
该书主要探讨了如何在基于ISO C89标准的C语言项目中运用面向对象设计技巧,使这些项目能够享受到面向对象编程带来的好处。作者假设读者已经具备良好的C语言基础,同时了解C++的面向对象模型也将有助于更好地理解这些...
面向对象编程(Object-Oriented Programming,简称OOP)是一种常用的软件开发方法,它通过将数据和处理数据的方法封装在对象中,使程序结构清晰、易于理解和维护。本篇文章将根据给定的“面向对象编程-选择题.pdf”...
通过抽象数据类型、对象、内存管理和动态链接等手段,可以在C语言中实现面向对象编程的核心理念,提升代码的组织性和复用性。 11. 练习 为了巩固这些知识,应该通过解决实际问题和编写练习代码来加深理解和应用,...
Java面向对象编程PDF ...Java面向对象编程的基础知识包括对象和类的概念、抽象的数据类型、类的成员、类的组成和类的转化过程。这些知识点是Java编程的基础,理解这些概念对于学习Java编程非常重要。
面向对象编程:Java中的抽象数据类型.doc
- 类是一种数据类型,它是对一组具有相同属性和行为的对象的抽象。 - 类可以看作是创建对象的模板,每个类的实例都是一个对象。 - 例如,定义一个“学生”类,可以包含姓名、年龄等属性,以及学习、休息等方法。 **...
面向对象编程(OOP)的基本特征包括抽象、封装、继承和多态。以下是根据给定的文件信息,对这些知识点的详细解释: 1. 抽象:在MATLAB面向对象编程中,抽象指的是从实际世界中提取问题的本质特征,并在程序中通过对象...
在LabVIEW中创建类可以定义用户自定义的数据类型,并且这些类型支持面向对象编程的特性,如封装和继承。 - **封装**:通过将数据和方法绑定到一起,使得数据对非成员VI不可见。这意味着外部VI只能通过成员VI访问类...
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,将数据和操作数据的方法封装在一起。在“写给大家看的面向对象编程书(第3版)”中,作者深入浅出地介绍了这一主题,...
5. **模板与泛型编程**:虽然不是面向对象特性,但C++的模板功能允许我们编写通用代码,处理不同类型的对象,与面向对象编程相结合,能提供强大的抽象能力。 6. **异常处理**:C++提供了异常处理机制,通过`try`, `...
Java是一种广泛使用的面向对象编程语言,它封装了数据和操作数据的行为,并支持继承和多态特性,使得Java程序可以高度模块化和复用。在Java中,面向对象编程(OOP)的三大基本特性是封装、继承和多态。 封装是面向...
为了充分体验C语言的面向对象编程,读者需要对ANSI-C有良好的掌握,包括结构体、指针、函数原型和函数指针的使用。随着书中内容的深入,读者会遇到面向对象编程中的“新术语”,并学会如何将这些抽象概念转化为实际...
面向对象编程(Object-Oriented Programming,简称OOP)是一种广泛应用的编程范式,它将程序设计中的实体抽象为对象,通过对象之间的交互来实现功能。这种编程方式使得代码更易于理解和维护,同时也增强了代码的复用...
《C语言面向对象设计》是一本深入探讨如何在C语言中实现面向对象编程思想的书籍。C语言,作为一种强大的低级编程语言,通常被认为不支持面向对象特性,但通过一些技巧和库(如GObject或C++的C接口),可以实现面向...
《JAVA面向对象编程》是孙卫琴老师的一本经典教材,深入浅出地讲解了Java语言的核心特性,尤其是面向对象编程的理念与实践。这本教材的示例源代码提供了丰富的学习资源,帮助读者通过实际操作理解理论知识。 首先,...
《C# 面向对象编程详解》 C# 是一种强大的、类型安全的编程语言,广泛用于构建各种类型的软件,尤其是Windows平台的应用程序。面向对象编程(Object-Oriented Programming,OOP)是C#的核心特性之一,它提供了一种...
在面向对象编程中,抽象通常通过抽象类和接口来实现。抽象类不能实例化,但可以作为其他类的基础;接口则定义了一组方法签名,具体的实现由实现该接口的类来完成。 #### Delphi中的面向对象编程实践 在Delphi中...
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它通过将数据和处理这些数据的方法组织成对象来实现软件开发。本文旨在深入浅出地介绍面向对象的基本概念,并探讨如何更好地理解和运用面向...