由结构到对象
? 通常, C库以一组函数开始, 但是还有比这些代
表行为和动作的函数更重要的东西, 就是一组表
达相近特性的数据, 即结构 。
? C库中都有各自定义的一组结构和一组作用在这
些结构之上的函数 。
? 从语言的发展来看, 对象 = 结构 + 函数
定义结构 ( 例一:动态数组 )
//An example of a C-like library,an array-like entity
created at runtime.
typedef struct CstashTag {
int size; //Size of each space
int quantity; //Number of storage spaces
int next; // next empty space
// Dynamically allocated array of bytes:
unsigned char* storage;
} CStash;
定义方法
void initialize ( CStash * s,int size);
void cleanup (CStash * s );
int add(CStash * s,const void * element );
void * fetch (CStash * s,int index );
int count (CStash * s );
void inflate (CStash * s,int increase) ;
///
实现方法
//方法 initialize的实现
// Declare structure and functions:
#include,Clib.h”
#include <iostream>
#include <cassert>
using spacename std;
const int increment = 100; //Quantity of elementsto add when increasing storage
void initialize ( CStash * s,int sz ) {
s->size = sz;
s->quantity = 0;
s->storage = 0;
s->next = 0; }
定义结构 ( 例二:堆栈 )
typedef struct CStackTag {
int size; //Size of each space
int quantity; //Number of stack spaces
int bottom;// Bottom of stack
int top; // top of stack
} CStack;
定义方法
void initialize ( CStack * s );
void cleanup (CStack * s );
int push(CStack * s,const void * element );
int pop (CStack * s );
///
存在的问题
? 问题一:
– 在这种库机制中, 必须向库中的每一个函数传递库中
所定义结构的地址, 这是相当笨拙的 。
? 问题二:
– 这种库机制中, 在读取所定义的结构的代码时容易与
函数调用的含义混淆, 在理解这些代码时会引起混乱 。
? 问题三:
– 名字冲突 ( name clashes), 不同的库中使用了相同的
函数名 。
? 为此, C库厂商通常在他们的库函数名前加上一个特殊的
字符串, 诸如,CStash_initialize ( )和 CStash_cleanup( ) 等 。
解决方法,让函数成为结构的成员
//An example of a C-like library,an array-like entity created
at runtime.
struct Stash {
int size; //Size of each space
int quantity; //Number of storage spaces
int next; // next empty space
// Dynamically allocated array of bytes:
unsigned char* storage;
// Functions!
void initialize ( int size);
void cleanup ( );
int add(const void * element );
void * fetch ( int index );
int count ( );
void inflate (int increase) ; }///
? 通常, C库以一组函数开始, 但是还有比这些代
表行为和动作的函数更重要的东西, 就是一组表
达相近特性的数据, 即结构 。
? C库中都有各自定义的一组结构和一组作用在这
些结构之上的函数 。
? 从语言的发展来看, 对象 = 结构 + 函数
定义结构 ( 例一:动态数组 )
//An example of a C-like library,an array-like entity
created at runtime.
typedef struct CstashTag {
int size; //Size of each space
int quantity; //Number of storage spaces
int next; // next empty space
// Dynamically allocated array of bytes:
unsigned char* storage;
} CStash;
定义方法
void initialize ( CStash * s,int size);
void cleanup (CStash * s );
int add(CStash * s,const void * element );
void * fetch (CStash * s,int index );
int count (CStash * s );
void inflate (CStash * s,int increase) ;
///
实现方法
//方法 initialize的实现
// Declare structure and functions:
#include,Clib.h”
#include <iostream>
#include <cassert>
using spacename std;
const int increment = 100; //Quantity of elementsto add when increasing storage
void initialize ( CStash * s,int sz ) {
s->size = sz;
s->quantity = 0;
s->storage = 0;
s->next = 0; }
定义结构 ( 例二:堆栈 )
typedef struct CStackTag {
int size; //Size of each space
int quantity; //Number of stack spaces
int bottom;// Bottom of stack
int top; // top of stack
} CStack;
定义方法
void initialize ( CStack * s );
void cleanup (CStack * s );
int push(CStack * s,const void * element );
int pop (CStack * s );
///
存在的问题
? 问题一:
– 在这种库机制中, 必须向库中的每一个函数传递库中
所定义结构的地址, 这是相当笨拙的 。
? 问题二:
– 这种库机制中, 在读取所定义的结构的代码时容易与
函数调用的含义混淆, 在理解这些代码时会引起混乱 。
? 问题三:
– 名字冲突 ( name clashes), 不同的库中使用了相同的
函数名 。
? 为此, C库厂商通常在他们的库函数名前加上一个特殊的
字符串, 诸如,CStash_initialize ( )和 CStash_cleanup( ) 等 。
解决方法,让函数成为结构的成员
//An example of a C-like library,an array-like entity created
at runtime.
struct Stash {
int size; //Size of each space
int quantity; //Number of storage spaces
int next; // next empty space
// Dynamically allocated array of bytes:
unsigned char* storage;
// Functions!
void initialize ( int size);
void cleanup ( );
int add(const void * element );
void * fetch ( int index );
int count ( );
void inflate (int increase) ; }///